[英]How to sort ArrayList<String> containing elements of ArrayList<HashMap<String, String>> that has been sorted by a comparator?
我通过JSON获取一些数据,这些数据存储在Hashmap映射中,例如map.put(KEY_TITLE,parser.getString(“ title”)) ,然后将该映射添加到ArrayList> bookList 。 这在以bookList作为适配器源的列表视图中显示。 另外,我还将地图的所有书籍信息(书名,作者,出版日期)存储在Arraylist arrTitles,arrAuthors,arrDates中,因为我需要将这些值传递给下一个活动。 我的问题是,当我使用比较器根据书名对bookList进行排序时,bookList得到很好的排序。 但是,我想按照bookList的新排序对arrTitles,arrAuthors和arrDates进行排序,以便我的arrTitles.getItem(position)将正确的值发送到下一个活动。 知道我该怎么做吗? 以下是哈希图,arraylist,onItemClick和比较器代码:
for (int i = 0; i < json.Length(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(KEY_ID, json.getString("id"));
map.put(KEY_TITLE, json.getString("title"));
map.put(KEY_AUTHOR, json.getString("author"));
map.put(KEY_DATE, json.getString("date"));
arrTitles.add(json.getString("title");
arrAuthors.add(json.getString("author");
arrDates.add(json.getString("date");
//add map to ArrayList
booksList.add(map);
}
list=(ListView)findViewById(R.id.list);
Collections.sort(booksList, mapComparator);
adapter=new LazyAdapter(this, booksList);
list.setAdapter(adapter);
// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent(this, editList.class);
intent.putExtra("title", arrTitles.getItem(position));
intent.putExtra("date", arrDates.getItem(position));
startActivity(intent);
}
});
}
public Comparator<Map<String, String>> mapComparator = new Comparator<Map<String, String>>() {
public int compare(Map<String, String> m1, Map<String, String> m2) {
return m1.get(KEY_TITLE).compareTo(m2.get(KEY_TITLE));
}
};
没错,使用新代码似乎相当简单:对地图列表进行排序后,只需创建单个列表即可:
// This loop looks wrong at the moment - you're not using i
for (int i = 0; i < json.Length(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(KEY_ID, json.getString("id"));
map.put(KEY_TITLE, json.getString("title"));
map.put(KEY_AUTHOR, json.getString("author"));
map.put(KEY_DATE, json.getString("date"));
booksList.add(map);
}
for (Map<String, String> map : booksList) {
arrTitles.add(map.get(KEY_TITLE));
arrAuthors.add(map.get(KEY_AUTHOR));
arrDates.add(map.get(KEY_DATE));
}
请注意,我仍然强烈建议创建一个Book
类来存储数据,而不是使用带有固定键的Map<String, String>
。 我怀疑,在代码的其他地方使用它会容易得多。
您的代码仅是正确的。 您必须按照要求进行格式化。 您会从json对象获取arrTitles,arrAuthors和arrDates。 据我了解,您必须在拍摄地图后获取数据。 下面是一些修改代码。 看看这个
for (int i = 0; i < json.Length(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(KEY_ID, json.getString("id"));
map.put(KEY_TITLE, json.getString("title"));
map.put(KEY_AUTHOR, json.getString("author"));
map.put(KEY_DATE, json.getString("date"));
//add map to ArrayList
booksList.add(map);
}
list=(ListView)findViewById(R.id.list);
Collections.sort(booksList, mapComparator);
adapter=new LazyAdapter(this, booksList);
list.setAdapter(adapter);
for (Map<String, String> map : booksList) {
arrTitles.add(json.getString("title");
arrAuthors.add(json.getString("author");
arrDates.add(json.getString("date");
}
// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent(this, editList.class);
intent.putExtra("title", arrTitles.getItem(position));
intent.putExtra("date", arrDates.getItem(position));
startActivity(intent);
}
});
书本列表中的地图具有所有必需的详细信息,所以为什么不从适配器中获取该特定列表项的地图对象,而从地图中获取详细信息。
@gvmani:我想您指的是一种类似于我在下面完成的实现:
HashMap <String,String> mapBook = booksList.get(position);
String strTitle = mapBook.get(KEY_TITLE);
String strAuthor = mapBook.get(KEY_AUTHOR);
Intent intent = new Intent(ListView.this,editList.class);
intent.putExtra("title", strTitle);
intent.putExtra("author", strAuthor);
startActivity(intent);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.