特定的OnItemClick Intent Android

时间:2011-07-27 18:46:49

标签: java android android-intent onitemclicklistener

我希望发生以下情况(一个简单的想法):我在主要活动中单击“添加”按钮,输入一些信息(进入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都是唯一的?我怀疑我将不得不使用位置变量。

3 个答案:

答案 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;重新充气,但它也可用于将值传递给点击处理程序,而无需跟踪成员变量状态。