【问题标题】:How to make Android list item pass id on to next view?如何让 Android 列表项将 id 传递给下一个视图?
【发布时间】:2013-09-25 14:31:56
【问题描述】:

在我的(第一个)Android 应用程序中,我有一个项目列表。每个项目都使用 item.xml 显示,其中我有一个 RelativeLayout。在这个布局中,我定义了android:onClick="showItemDetails",其中的方法如下所示:

public void showItemDetails(View view) {
    Intent intent = new Intent(this, itemDetails.class);
    intent.putExtra("itemId", "5");
    this.startActivity(intent);
}

正如你所看到的,我传递了一个硬编码的 id,所以无论你当前点击什么项目,它显然只显示项目 nr 5。我现在需要动态地为这个方法提供 id。 itemlist 是在 ItemListAdapter 类中创建的,其中一部分是这样的:

holder.description.setText(rowItem.eventDescription);
holder.amount.setText(rowItem.getDisplayAmount());

我在rowItem.id 下也有 ID,但我有点不知道该怎么处理它。

这里有人可以帮帮我吗?我需要做什么才能让列表项正确地将 id 传递给 itemDetails 类?欢迎所有提示!

【问题讨论】:

  • 不要使用android:onClick(View.OnClickListener 实现) ...改用ListView/AdapterView.OnItemClickListener 实现 + 覆盖适配器的getItemId 并返回rowItemsss.get(position).id 然后在AdapterView.OnItemClickListener.onItemClick(...) 实现中你会得到你在idarg 中的ID
  • @Selvin:这是一个答案,不是评论
  • @gunar 如您所见,写出好的答案需要时间:)
  • @kramer65 检查我的答案中的“或:”代码

标签: java android argument-passing


【解决方案1】:

前几个假设:

  • 你没有使用Fragments 只是普通的Activity 称为OuterActivityClass
  • rowItem var 的类型为 RowItemClass
  • 您的ItemListAdapter 正在扩展ArrayAdapter<RowItemClass>
  • 你做的“正确”(ItemListAdapter没有自己的List<RowItemClass>字段,getView(...)中的rowItem被分配为rowItem = getItem(possition);不像rowItem = yourListFieldInAdapter.get(position);(我不知道为什么Ppls使用这样的字段因为ArrayAdapter<?> 内部已经有了它)......如果你这样做“不好”,用yourListFieldInAdapter.get(position) 替换我的答案中出现的所有getItem(possition)
  • RowItemClass 的 id 字段为 long 或 int(如果不使用“或:”版本)

你必须做什么:

  1. item.xml 中删除android:onClick
  2. ItemListAdapter 中覆盖hasStableIds()public boolean hasStableIds () { return true; }
  3. 在适配器中覆盖getItemId(...)public long getItemId (int position) { return getItem(position).id; }
  4. Activity onCreate(...) 获取列表视图:ListView listView = findViewById(R.id.your_listview_id);
  5. 然后将监听器分配给您的 listView(也在 onCreate 中)

代码:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   void onItemClick(AdapterView<?> parent, View view, int position, long id){
      Intent intent = new Intent(OuterActivityClass.this, itemDetails.class);
      intent.putExtra("itemId", id + ""); //+ "" to make it string, of course you can use long but you have to remeber to use intent.getLongExtra(...) in details Activity
      startActivity(intent);
   }
});

或:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   void onItemClick(AdapterView<?> parent, View view, int position, long id){
      final RowItemClass clickedItem  = (RowItemClass)parent.getItemAtPosition(position);
      Intent intent = new Intent(OuterActivityClass.this, itemDetails.class);
      intent.putExtra("itemId", clickedItem.id + "");
      startActivity(intent);
   }
});

使用第二种方法,您可以省略第 2 点和第 3 点。(如果您在适配器实现中使用“坏”方式覆盖 getItem (return yourListFieldInAdapter.get(pos)) 和 getCount( return yourListFieldInAdapter.size()))

题外话提示:不要在类名itemDetails => ItemDetails 中使用小写作为第一个字母...为了您的理智:)(OMG,OMG,itemDetails 是变量或类名)

【讨论】:

  • 太棒了!我快到了!我唯一不明白的是 OuterActivityClass 应该是什么?
  • 你有一个用showAllOverviewEvents扩展Activity的类......你应该用这个类的名字替换OuterActivityClass......因为匿名OnItemClickListener实现中的thisOnItemClickListener的类型而不是外部类:class Outer { class Inner { void Method() { /*here this means Inner instance but Outer.this means Outer instance */} } }
  • 非常感谢!这真的太棒了!你救了我的一天! :D
【解决方案2】:
In your Main Activity

String item =  country.getName();
           Intent intent= new Intent(MainActivityActivity.this,AnotherActivity.class);
                    intent.putExtra(EXTRA_RESPONSE, item);
                    startActivity(intent);





In Next Activity
String country =  getIntent().getStringExtra(MainActivity.EXTRA_COUNTRY);
    TextView textView = (TextView) findViewById(R.id.tvPhone);
    textView.setText(country);

【讨论】:

    【解决方案3】:

    如果我正确理解您的问题,那么您可以尝试在适配器中设置 OnClickListener(不要在 xml 中设置 onClick)。在你的适配器中尝试类似:

    public View getView(int position, View convertView, ViewGroup parent) {
         ...
         View rootLayout = convertView.findViewById(R.id.item_layout_root);  
         ...
         rootLayout.setOnClickListener(new OnClickListener() {
             public void onClick(View v) {
               showItemDetails(rowItem.id);  
             }
         });
    return convertView;
    

    您的 showItemDetails 将更改为

    showItemDetails(int id) {
        Intent intent = new Intent(this, itemDetails.class);
        intent.putExtra("itemId", id);
        this.startActivity(intent);
    }
    

    【讨论】:

    • @Selvin - 那你建议怎么做呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多