我希望发生以下事情(一个简单的想法):在我的主要活动中单击Add按钮,输入一些信息(到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都是唯一的?我怀疑我将不得不使用位置变量。
发布于 2011-07-28 01:24:31
两项建议:
将数据传递给您的方法,而不是使用类字段:
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接口,以便能够传递您的类的意图。您的设计将工作,但这将是非常难以理解的下一个人(包括你在6个月),更难以扩展。
发布于 2011-07-27 18:52:18
如果不看到您的addItem()代码,很难判断,您是如何将这些项添加到列表中的?假设您有一个存储值的适配器,如果是的话,那么在onItemClick()中执行painItem = adapter.getItem(position)。然后使用这个painItem对象组装您的意图。
发布于 2011-07-27 19:03:56
之所以会出现这种情况,是因为在onItemClick中发送的信息绝不是基于单击了哪一行--而是基于在onActivityResult中设置的最新值,这些值是由单击的最后一个项设置的。
一种解决方案是使用ViewHolder模式的修改版本将特定于行的值附加到视图中,然后在onItemClick中使用view.getTag检索这些值。ViewHolder模式的良好示例代码可以找到这里。它通常用于存储视图,这样它们就不会不断地被重新创建&重新膨胀,但是它也可以用于传递值以单击处理程序,而不需要跟踪成员变量状态。
https://stackoverflow.com/questions/6849568
复制相似问题