2012-12-05 3 views
0

나는 안드로이드에 약간의 문제가 있습니다. XML 파싱을 사용하여 데이터베이스에서 검색된 항목의 정렬 된 목록 뷰가 있습니다. 여기XML 구문 분석을 사용하여 Android listview 정렬

public class Catalogue extends Activity { 

// static String URL = "https://dl.dropbox.com/u/48258247/catalogue.json"; 
static final String URL = "http://192.168.1.168/xcart432pro/internet.xml"; 

static String KEY_CATEGORY = "Product"; 
static final String KEY_TITLE = "Name"; 

static final String KEY_DESCRIPTION = "Description"; 
static final String KEY_COST = "Price"; 
static final String KEY_THUMB_URL = "Image"; 

ListView list; 
ListAdapter adapter; 

/** Called when the activity is first created. */ 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 
     XMLParser parser = new XMLParser(); 
     String xml = parser.getXmlFromUrl(URL); // getting XML from URL 
     Document doc = parser.getDomElement(xml); // getting DOM element 

     NodeList nl = doc.getElementsByTagName(KEY_CATEGORY); 

     // looping through all song nodes &lt;song&gt; 
     for (int i = 0; i < nl.getLength(); i++) { 
      // creating new HashMap 
      HashMap<String, String> map = new HashMap<String, String>(); 
      Element e = (Element) nl.item(i); 
      // adding each child node to HashMap key =&gt; value 

      map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE)); 
      map.put(KEY_DESCRIPTION, parser.getValue(e, KEY_DESCRIPTION)); 
      map.put(KEY_COST, parser.getValue(e, KEY_COST)); 
      map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL)); 

      // adding HashList to ArrayList 
      songsList.add(map); 
     } 

     list=(ListView)findViewById(R.id.listView1); 

     // Getting adapter by passing xml data ArrayList 
     adapter=new ListAdapter(this, songsList); 
     list.setAdapter(adapter); 
     // Bundle bundle = getIntent().getExtras(); 

     // KEY_CATEGORY=bundle.getString(KEY_SUBCATE); 


     // Click event for single list row 
     list.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       HashMap<String, String> map = songsList.get(position); 
       Intent in = new Intent(
         Catalogue.this, 
         com.ssmobileproductions.catalogue.SingleMenuItem.class); 
       in.putExtra(KEY_TITLE, map.get(KEY_TITLE)); 
       in.putExtra(KEY_DESCRIPTION, map.get(KEY_DESCRIPTION)); 
       in.putExtra(KEY_THUMB_URL, map.get(KEY_THUMB_URL)); 
       in.putExtra(KEY_COST, map.get(KEY_COST)); 
       startActivity(in); 

      } 

     }); 

: 이것은 내 안드로이드 코드

<Feed> 
<category> 
<Product> 
<Name>New Masters of Flash</Name> 
<Price>79.99</Price> 
</Product> 
<Product> 
<Name>Professional Java Server Programming</Name> 
<Price>63.99</Price> 
</Product> 
<Product> 
<Name>Designing Web Usability</Name> 
<Price>80.00</Price> 
</Product> 
</category> 
</Feed> 

입니다

: 이것은 내 XML 피드입니다

가격으로 분류하여

은 내가 표시 목록보기에 제품이 나는 에 제품을 표시하고 가격을으로 정렬하여 보여줍니다. 어떻게 할 수 있습니까? 안드로이드 프로그래밍 방식으로.

편집 :

Button btninsert = (Button) findViewById(R.id.sort); 
    btninsert.setOnClickListener(new View.OnClickListener() { 

     final ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 

    public void onClick(View v) { 
     Collections.sort(songsList, new PriceComparator()); 
    } 
    }); 
      final ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 

     XMLParser parser = new XMLParser(); 
     String xml = parser.getXmlFromUrl(URL); // getting XML from URL 
     Document doc = parser.getDomElement(xml); // getting DOM element 

     NodeList nl = doc.getElementsByTagName(KEY_CATEGORY); 

하나 개의 클래스를 생성하고 아래의 코드 작성 : 나는 몇 가지 코드를 아래와 같이 추가 한 내가 응용 프로그램을 실행하고 클릭해야 이제

public class PriceComparator implements Comparator<HashMap<String, String>> { 
static final String KEY_COST = "Price"; 

public PriceComparator() { 
    // TODO Auto-generated constructor stub 

} 



public int compare(HashMap<String, String> map1, HashMap<String, String> map2) { 
    return map1.get(KEY_COST).compareTo(map2.get(KEY_COST)); 
} 

을 버튼은 아무 것도 일어나지 않는다는 것을 의미합니다 ????

하지만 가격을 기준으로 제품 목록을 표시해야합니다. 당신의 어댑터를 작성하기 전에

Comparator<HashMap<String, String>> comparator = new Comparator<HashMap<String, String>>() { 
    @Override 
    public int compare(HashMap<String, String> map1, HashMap<String, String> map2) { 
     return map1.get(KEY_COST).compareTo(map2.get(KEY_COST)); 
    } 
}; 

그리고 종류의 목록 :

+0

문제는 무엇인가 :

public class PriceComparator implements Comparator<HashMap<String, String>> { public PriceComparator() { // TODO Auto-generated constructor stub } public int compare(HashMap<String, String> map1, HashMap<String, String> map2) { return map1.get(KEY_COST).compareTo(map2.get(KEY_COST)); } } 

그리고 당신의 ArrayList를이 사용자 정의 비교>를 적용, 같은합니까? '목록보기 가격에 따라 항목의 실제 데이터베이스 행 ID를 얻으려면 어떻게해야합니까?'또는 '목록보기에 제품을 표시하려면'두 가지 모두 잘 할 수있는 것처럼 보이기 때문입니다. – mango

+0

@mango 굵게 표시된 텍스트를 확인하십시오. –

답변

2

난 당신이 사용자 정의 비교기를 사용할 필요가 생각

Collections.sort(songsList, comparator); 

추가
당신이 필요 약간의 변경을하십시오.

  1. listadapter처럼 songsList 필드 변수 확인 :

    ListView list; 
    ListAdapter adapter; 
    ArrayList<HashMap<String, String>> songsList; // Add me! 
    
  2. 업데이트를 당신이 songsList 초기화 방법 :

    :

    songsList = new ArrayList<HashMap<String, String>>(); // Shorten me! 
    
  3. onClick 방법 변경 0

    public void onClick(View v) { 
        Collections.sort(songsList, comparator); 
        adapter.notifyDataSetChanged(); // Add me! 
    } 
    
+0

여기 map1과 map2가 의미하는 것 – user1859172

+0

'map1'과'map2'는'sort()'에 의해 사용됩니다. 컬렉션은 한 번에 하나씩 각 HashMap을 비교하여 목록을 정렬합니다. 나는 나의 대답을 업데이트했다. – Sam

+0

안녕하세요 이것은 내 전체 소스 코드입니다 http : //pastie.org/5482747이 버튼을 클릭하면 아무 것도 일어나지 않습니다 here.please help me.what 실수가 여기에 있습니다. – user1859172

0

를 사용하여 해시 테이블과 다음과 같은 키를 정렬 :

여기

해시 테이블의 이름과 가격을 포함하고, 키가 너무 키를 정렬 한 후 addind sortedItems 벡터에 정렬 된 요소는 반환, 가격이 포함됩니다 당신은 정렬 된 요소들입니다.

Hashtable hash = new Hashtable(); 
Vector<String> sortedItems = new Vector<String>(); 
Enumeration enumeration = hash .keys(); 
     Vector keySet = new Vector(); 
     while (enumeration.hasMoreElements()) { 
      keySet.add(enumeration.nextElement()); 
     } 

     Collections.sort(keySet); 
     Iterator i = keySet.iterator(); 
     String str; 
     while (i.hasNext()) { 
      str = (String) i.next(); 
      sortedItems.addElement(hash .get(str)); 
      Log.e("", (str + ":" + hash .get(str))); 
     } 
1

표시

=> 당신은 ArrayList에가있는 것처럼이>, 당신은 비교를 위해 사용자 정의 비교기를 작성해야 가격으로 분류와 목록보기에 제품. 예를 들어

:

Collections.sort(mylist, new PriceComparator()); 
+0

나는 (동일한 기본 아이디어를 사용했기 때문에) 귀하의 접근 방식을 좋아하지만 변수가 일치하지 않습니다. – Sam

+0

교정을 위해 @ 샘 고맙습니다. –

+0

@Paresh Mayani 제 편집 된 질문을 읽고 저에게 해결책을주십시오. – user1859172

관련 문제