0

我在使用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));
}

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

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

4

3 回答 3

2

我相信您需要使用自定义比较器:

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一个字段变量,例如listand adapter

    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!
    }
    
于 2012-12-05T06:55:42.800 回答
1

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

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

例如:

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());
于 2012-12-05T06:56:42.897 回答
0

使用 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)));
        }
于 2012-12-05T06:56:34.970 回答