我希望发生以下情况(一个简单的想法):我在主要活动中单击“添加”按钮,输入一些信息(进入EditText框),然后返回主屏幕。在这里,我想显示一个列表,只有两个标题(不是所有信息)。当我单击该列表项目时,我想显示该项目的相应保存信息。因此,每个项目的信息将会有所不同。
当我这样做时,我使用主屏幕中的startActivityForResult()然后返回。这适用于一个项目。当我添加另一个项目时,问题就出现了。无论我点击哪个项目,显示的信息都是相同的。简而言之,我需要找到一种方法来保存每个项目唯一的信息。
截至目前,我有以下代码段:
//After I add all the information in the second intent
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == 1) {
//these display in the list (Each list item has two textfields,row1 and row 2)
row1 = data.getStringExtra("com.painLogger.row1");
row2 = data.getStringExtra("com.painLogger.row2");
//below is the other info entered
painLevelString = data.getStringExtra("com.painLogger.painLevel");
painLocation = data.getStringExtra("painLocation");
timeOfPainString = data.getStringExtra("com.painLogger.painTime");
textTreatmentString = data
.getStringExtra("com.painLogger.treatment");
addItem();
}
}
//When I click the item-- this is the info that is not unique...
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
Intent intent = new Intent(this, Item1.class);
intent.putExtra("com.painLogger.painLevel", painLevelString);
intent.putExtra("com.painLogger.painTime" , timeOfPainString);
intent.putExtra("com.painLogger.treatment", textTreatmentString);
intent.putExtra("painLocation", painLocation);
startActivity(intent);
}
// 编辑:添加项目代码
private void addItem() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("row_1", row1);
map.put("row_2", row2);
painItems.add(map);
adapter.notifyDataSetChanged();
}
// * 编辑:一些定义*
SimpleAdapter adapter;
List<HashMap<String, String>> painItems = new ArrayList<HashMap<String, String>>();
我能理解为什么会发生这种情况 - 每次点击一个项目时,意图就是放入最后一个,这意味着添加了最后一个对象的信息。如何使每个OnItemClick都是唯一的?我怀疑我将不得不使用位置变量。
答案 0 :(得分:2)
两条建议:
将数据传递给您的方法,而不是使用类字段:
addItem(String row1, String row2...){...}
此外,您想要从地图中获取数据:
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
Intent intent = new Intent(this, Item1.class);
intent.putExtra("com.painLogger.painLevel", painItems.get(position).get("row_1"));
intent.putExtra("com.painLogger.painTime" , painItems.get(position).get("row_2"));
intent.putExtra("com.painLogger.treatment", painItems.get(position).get("row_3"));
intent.putExtra("painLocation", painItems.get(position).get("row_4"));
startActivity(intent);
}
当然你需要在创建时将“row_3”和“row_4”放入地图中,我相信你还没有这样做。
DMon在评论中建议您在不同的答案中创建一个代表您的数据的类,他是对的,这是更好的设计并有助于节省这些问题。为此,您需要查看Parcelable接口,以便能够通过Intents传递您的类。你的设计会起作用,但是对于下一个人(包括你在6个月内)很难理解并且更难以扩展。
答案 1 :(得分:0)
如果没有看到addItem()
代码,很难说清楚,如何将这些项目添加到列表中?大概你有一个存储值的适配器,如果是,那么在onItemClick()
中,你会painItem = adapter.getItem(position)
。然后,您将使用此painItem
对象组装您的Intent。
答案 2 :(得分:0)
发生这种情况的原因是onItemClick中发送的信息基于基于点击的行 - 它基于onActivityResult中设置的最新值,它们是由最后项目设置点击。
一种解决方案是使用ViewHolder模式的修改版本将特定于行的值附加到View,然后在onItemClick中使用view.getTag检索这些值。可以找到ViewHolder模式的良好示例代码here。它通常用于存储视图,以便它们不会不断地重新创建&amp;重新充气,但它也可用于将值传递给点击处理程序,而无需跟踪成员变量状态。