2013-01-11 1 views
1

나는 구문 분석 오전 RSS 피드가 있습니다. 나는 그것을 pubdate에 의해 위에서 아래로 정렬하고 정리할 필요가있다. 여기에 내가 사용하고있는 코드가있다.안드로이드에 pubdate에 의해 목록 뷰에서 내 XML을 정렬하는 방법

XML 파서

public class XMLParser { 

// constructor 
public XMLParser() { 

} 

/** 
* Getting XML from URL making HTTP request 
* @param url string 
* */ 
public String getXmlFromUrl(String url) { 
    String xml = null; 

    try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(url); 

     HttpResponse httpResponse = httpClient.execute(httpPost); 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     xml = EntityUtils.toString(httpEntity); 

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    // return XML 
    return xml; 
} 

/** 
* Getting XML DOM element 
* @param XML string 
* */ 
public Document getDomElement(String xml){ 
    Document doc = null; 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    try { 

     DocumentBuilder db = dbf.newDocumentBuilder(); 

     InputSource is = new InputSource(); 
      is.setCharacterStream(new StringReader(xml)); 
      doc = db.parse(is); 

     } catch (ParserConfigurationException e) { 
      Log.e("Error: ", e.getMessage()); 
      return null; 
     } catch (SAXException e) { 
      Log.e("Error: ", e.getMessage()); 
      return null; 
     } catch (IOException e) { 
      Log.e("Error: ", e.getMessage()); 
      return null; 
     } 

     return doc; 
} 

/** Getting node value 
    * @param elem element 
    */ 
public final String getElementValue(Node elem) { 
    Node child; 
    if(elem != null){ 
     if (elem.hasChildNodes()){ 
      for(child = elem.getFirstChild(); child != null; child = child.getNextSibling()){ 
       if(child.getNodeType() == Node.TEXT_NODE ){ 
        return child.getNodeValue(); 
       } 
      } 
     } 
    } 
    return ""; 
} 

/** 
    * Getting node value 
    * @param Element node 
    * @param key string 
    * */ 
public String getValue(Element item, String str) {  
     NodeList n = item.getElementsByTagName(str);   
     return this.getElementValue(n.item(0)); 
    } 
} 

구문 분석 활동

public class AndroidXMLParsingActivity extends ListActivity { 

// All static variables 
static final String URL = "http://www.cpcofc.org/devoapp.xml"; 
// XML node keys 
static final String KEY_ITEM = "item"; // parent node 
static final String KEY_ID = "item"; 
static final String KEY_NAME = "title"; 
static final String KEY_COST = "description"; 
static final String KEY_DESC = "description"; 

ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); 

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

    NodeList nl = doc.getElementsByTagName(KEY_ITEM); 
    // looping through all item nodes <item> 
    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 => value 
     map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
     map.put(KEY_NAME, parser.getValue(e, KEY_NAME)); 
     map.put(KEY_COST, parser.getValue(e, KEY_COST)); 
     map.put(KEY_DESC, parser.getValue(e, KEY_DESC)); 

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

    // Adding menuItems to ListView 
    ListAdapter adapter = new SimpleAdapter(this, menuItems, 
      R.layout.list_item, 
      new String[] { KEY_DESC, KEY_NAME, KEY_COST}, new int[] { 
        R.id.desciption, R.id.name, R.id.cost}); 

    setListAdapter(adapter); 

    // selecting single ListView item 
    ListView lv = getListView(); 

    lv.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      // getting values from selected ListItem 
      String name = ((TextView) view.findViewById(R.id.name)).getText().toString(); 
      String cost = ((TextView) view.findViewById(R.id.cost)).getText().toString(); 

      // Starting new intent 
      Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class); 
      in.putExtra(KEY_NAME, name); 
      in.putExtra(KEY_COST, cost); 
      startActivity(in); 

     } 
    }); 
} 
} 
다음

이 지금 나는 1 일이의 반전을 보여줄 필요가

enter image description here

모습입니다 상단에. 누구나이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

답변

3

당신은 그냥 당신이 원하는 것을 달성하기 위해 우리는 자바 컬렉션 프레임 워크에서 제공하는 컬렉션 클래스를 사용할 수 있습니다 를 목록의 순서를 반대로 할 필요가 ... 여기에 간단한 코드

Collections.reverse(menuItems); 

는 것입니다 귀하의 컬렉션을 반대로 .... 나는 이것이 당신을 도울 것이라고 희망합니다.

+0

감사합니다. 완벽하게 작동했으며 정확하게 필요한 것을 수행했습니다. – Bryan

0

당신을 위해 그것을 구현하는 ArrayAdapter 클래스를 재정의 할 필요가 없습니다. 일반 유형 객체를 표시하려는 방식대로 정렬하는 자체 Comparator를 작성하면됩니다. 또한이 방법을 사용하면 코드가 올바르게 작동합니다. 더 참고로

adapter = new CustomAdapter(this, R.layout.list,R.id.title, data); 

adapter.sort(new Comparator<RowData>() { 
    public int compare(RowData arg0, RowData arg1) { 
     return arg0.mProductName.compareTo(arg1.mProductName); 
    } 
}); 

setListAdapter(adapter); 
adapter.notifyDataSetChanged(); 

..

https://github.com/bauerca/drag-sort-listview/tree/master/demo

0

모두 이전 답변

http://www.vogella.com/articles/AndroidListView/article.html#listview_filtersort

때문에 ArrayList를 통해 그들이 루프에 한 번 이상 몇 가지 성능을 요할 것이다.

당신은 단순히 다음과 같이 루프에 대한 역 반복자를 사용할 수는 getLength 방법마다 전화보다 훨씬 빠르다 원인

int len = nl.getLength(); 
for (int i = len; i > 0; --i) 

는 나 또한 지역 변수에 배열의 길이를 추출 하였다.

관련 문제