0

在我的(第一个)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());

我也有下面的 id rowItem.id,但我有点迷失了我应该用它做什么。

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

4

3 回答 3

2

前几个假设:

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

你必须做的:

  1. 摆脱android:onClick_item.xml
  2. 覆盖:hasStableIds()_ItemListAdapterpublic 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 是变量或类名)

于 2013-09-25T15:35:10.203 回答
0
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);
于 2016-12-02T07:41:13.153 回答
-2

如果我正确理解您的问题,那么您可以尝试在适配器中设置 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);
}
于 2013-09-25T14:50:15.583 回答