【问题标题】:Android listview sorting using xml parsingAndroid listview排序使用xml解析
【发布时间】:2012-11-22 22:54:27
【问题描述】:

我在使用 android 时遇到了一些问题。我有一个使用 xml 解析从数据库中检索到的项目的排序列表视图。

我必须在列表视图中按价格排序显示产品

这是我的 xml 提要:

<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>

这是我的安卓代码:

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);

            }

        });

在这里我必须在列表视图中显示产品并按价格排序。我该怎么做。请在 android 中以编程方式帮助我。

编辑: 我添加了如下代码:

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));
}

现在我必须运行应用程序并单击按钮意味着什么都没有发生????

但我必须显示产品列表是按价格排序的。

【问题讨论】:

  • 问题是什么? How do you get the actual database row id of the item based upon the listview price?to display the product on list view 因为看起来你可以做到这两点。

标签: java android sorting xml-parsing hashmap


【解决方案1】:

我认为您需要使用自定义比较器:

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));
    }
};

然后在创建适配器之前对列表进行排序:

Collections.sort(songsList, comparator);

加法
你需要做一些小的改变。

  1. songsList 设为字段变量,例如listadapter

    ListView list;
    ListAdapter adapter;
    ArrayList<HashMap<String, String>> songsList; // Add me!
    
  2. 更新你初始化songsList的方式:

    songsList = new ArrayList<HashMap<String, String>>(); // Shorten me!
    
  3. 更改您的onClick 方法:

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

【讨论】:

  • 这里map1和map2是什么意思
  • map1map2sort() 使用。 Collections 通过一次比较每个 HashMap 来对 List 进行排序。我更新了我的答案。
  • 嗨,这是我的完整源代码:pastie.org/5482747 我必须点击这个按钮意味着这里没有发生任何事情。请帮助我。这里发生了什么错误
  • 我已经在我的代码中添加了上面的代码。现在我必须运行应用程序并单击按钮意味着什么都没有发生???
  • 感谢您的成功。感谢您的快速回复。
【解决方案2】:

使用 Hashtable 对键进行排序,如下所示:

这里的 hashTable 将包含名称和价格,而键将包含价格,因此排序键然后将已排序的元素添加到 sortedItems Vector 将返回已排序的元素。

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)));
        }

【讨论】:

    【解决方案3】:

    在列表视图中显示产品并按价格排序

    => 因为你有 ArrayList>,你需要创建自定义 Comparator 来进行比较。

    例如:

    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>,请执行以下操作:

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

    【讨论】:

    • 我喜欢你的方法(因为我使用了相同的基本思想),但你的变量不匹配。
    • @Paresh Mayani 请阅读我编辑过的问题并为我提供解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2011-04-30
    • 2012-10-19
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多