我通过JSON获取一些数据,我将其存储在 Hashmap地图中,例如 map.put(KEY_TITLE,parser.getString(“title”))然后将地图添加到 ArrayList>书目即可。这将显示在列表视图中,其中bookList作为适配器的源。此外,我还将地图的所有书籍信息(标题,作者,发布日期)存储在 Arraylist arrTitles,arrAuthors,arrDates 中,因为我需要将这些值传递给我的下一个活动。我的问题是当我使用比较器根据标题对bookList进行排序时,bookList就可以正常排序了。然而,我想根据bookList的新排序对我的arrTitles,arrAuthors和arrDates进行排序,以便我的arrTitles.getItem(position)将正确的值发送到下一个活动。知道我怎么能这样做吗?下面是hashmap,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));
}
};
答案 0 :(得分:2)
是的,使用新代码看起来相当简单:只需在之后创建单个列表,您就已经对地图列表进行了排序:
// 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>
。我怀疑,在代码中的其他地方工作会更简单。
答案 1 :(得分:2)
您的代码只是正确的。您必须根据要求进行格式化。你从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);
}
});
答案 2 :(得分:1)
书单中的地图包含所有必需的详细信息,所以为什么不从适配器获取该特定列表项的地图对象,并从地图中获取详细信息。
答案 3 :(得分:0)
@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);