繁体   English   中英

如何使Android列表项将ID传递到下一个视图?

[英]How to make Android list item pass id on to next view?

在我的(第一个)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,因此无论您当前单击什么项目,它显然仅显示项目5。我现在需要动态地将此方法指定为ID。 itemlist是在ItemListAdapter类中创建的,该类的一部分是:

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

我在rowItem.id下也有id,但是我有点不知道该怎么办。

有人可以帮我一下吗? 我需要怎么做才能使列表项正确地将ID传递给itemDetails类? 欢迎所有提示!

前几个假设:

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

您要做的是:

  1. item.xml摆脱android:onClick
  2. ItemListAdapter覆盖hasStableIds()public boolean hasStableIds () { return true; } public boolean hasStableIds () { return true; }
  3. 在适配器中重写getItemId(...)public long getItemId (int position) { return getItem(position).id; } public long getItemId (int position) { return getItem(position).id; }
  4. Activity onCreate(...)获取ListView: 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。(如果在适配器实现中使用了“不好的”方式return yourListFieldInAdapter.get(pos)重写getItemreturn yourListFieldInAdapter.get(pos) )和getCountreturn yourListFieldInAdapter.size() ))

脱离主题的提示:出于您的理智, ItemDetails在类名itemDetails => ItemDetails ...中使用小写字母作为首字母:)(OMG,OMG,itemDetails是变量或类名)

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);

如果我正确理解您的问题,则可以尝试在适配器中设置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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM