【问题标题】:Specific OnItemClick Intent Android特定的 OnItemClick Intent Android
【发布时间】:2011-07-27 18:46:49
【问题描述】:

我希望发生以下情况(一个简单的想法):我在主活动中单击添加按钮,输入一些信息(进入 EditText 框),然后返回主屏幕。在这里,我想显示一个列表,只有两个标题(不是所有信息)。当我单击该列表项目时,我想显示该项目的相应保存信息。因此,每个项目的信息都会有所不同。

当我这样做时,我从主屏幕使用 startActivityForResult() 然后返回。这对一个项目非常有效。当我添加另一个项目时,问题就出现了。无论我点击哪个项目,显示的信息都是一样的。简而言之,我需要找到一种方法来保存每个项目独有的信息。

截至目前,我有以下代码 sn-p :

 //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 独一无二?我怀疑我将不得不使用位置变量。

【问题讨论】:

  • 你要保存到哪里?
  • 每个项目的信息保存在哪里?
  • 不幸的是,我认为这是问题所在。我只保存数组列表,如我之前的问题所示(目前正在工作):stackoverflow.com/questions/6839965/…。那么我将如何保存每个项目的信息呢?

标签: java android android-intent onitemclicklistener


【解决方案1】:

两个建议:

将数据传递给您的方法,而不是使用类字段:

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 接口,以便能够通过 Intent 传递您的类。你的设计会奏效,但下一个人(包括 6 个月后的你)将很难理解,而且更难扩展。

【讨论】:

  • 问题是,我不想在每个项目(行)中显示其他内容。如果我将 row_3 和 row_4 放在地图中,我是否必须显示它们?
  • 非常感谢。问题解决了。出于某种原因,您的解决方案似乎总是有效。我无法表达我现在的心情:P
  • mbarnes,有没有办法在地图中放置图像?我想做同样的事情,除了图像,而不是字符串......
  • HashMap map = new HashMap();
  • 我怎样才能对图片做同样的事情?显然,我不能使用 painItems.add(pictureMap),其中 pictureMap 将是 HashMap 映射....?还有其他方法可以将它添加到 painItems 中吗?
【解决方案2】:

没有看到您的addItem() 代码很难判断,您是如何将项目添加到列表中的?大概你有一个存储值的适配器,如果是这样,那么在onItemClick(),你会做painItem = adapter.getItem(position)。然后,您将使用此 painItem 对象组装您的 Intent。

【讨论】:

  • 我没有保存每个项目的信息。请查看:stackoverflow.com/questions/6839965/… 以了解我如何保存列表本身。如果你能帮我做你概述的事情,我将不胜感激......如果你能给我示例代码,那将非常有帮助
  • 就像现在一样,您可以使用Map painItem = painItems.get(position) 并从那里检索您的数据,但是,使用List&lt;HashMap&lt;String, String&gt;&gt; 听起来是个坏主意。相反,请尝试创建自己的对象类并从那里保存/加载数据。
【解决方案3】:

发生这种情况的原因是 onItemClick 中发送的信息绝不基于单击的行 - 它基于 onActivityResult 中设置的最新值,这些值由 最后一个项被点击。

一种解决方案是使用 ViewHolder 模式的修改版本将特定于行的值附加到视图,然后在 onItemClick 中使用 view.getTag 检索这些值。可以在 here 找到 ViewHolder 模式的良好示例代码。它通常用于存储视图,以便它们不会不断地重新创建和重新膨胀,但它也可以用于将值传递给点击处理程序,而无需跟踪成员变量状态。

【讨论】:

  • 能否提供我的实例的示例代码?我不太确定你在说什么......
  • developer.android.com/resources/samples/ApiDemos/src/com/… 覆盖它。基本上,您将一堆数据存储在一个对象中,使用 view.setTag(Object o) 方法将该对象作为“标记”附加到行的值,然后从 onClick 使用 getTag 检索它。
猜你喜欢
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
相关资源
最近更新 更多