如何让Android列表项传递给下一个视图?

时间:2013-09-25 14:31:56

标签: java android argument-passing

在我的(第一个)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传递给itemDetails类,我需要做什么?欢迎所有提示!

3 个答案:

答案 0 :(得分:2)

前几个假设:

  • 您没有使用名为Fragments的{​​{1}} Activity
  • OuterActivityClass var有typ rowItem
  • 您的RowItemClass正在延长ItemListAdapter
  • 您“正确”执行此操作(ArrayAdapter<RowItemClass>没有自己的ItemListAdapter字段,List<RowItemClass>中的rowItem被指定为getView(...)而不是{{1} (我不知道为什么Ppls使用这样的字段,因为rowItem = getItem(possition);已经在内部)...如果你这样做“坏”,用rowItem = yourListFieldInAdapter.get(position);替换我的答案中的所有ArrayAdapter<?>次出现
  • getItem(possition)的id字段为long或int(如果不使用“或:”版本)

你需要做什么:

  1. yourListFieldInAdapter.get(position)
  2. 中删除RowItemClass
  3. android:onClickitem.xml
  4. 中覆盖hasStableIds()
  5. 在适配器中覆盖ItemListAdapterpublic boolean hasStableIds () { return true; }
  6. getItemId(...) public long getItemId (int position) { return getItem(position).id; }获取ListView:Activity
  7. 然后将侦听器分配给listView(也在onCreate中)
  8. 代码:

    onCreate(...)

    或:

    ListView listView = findViewById(R.id.your_listview_id);

    使用第二种方法,您可以省略第2点和第3点。(如果您使用“错误”方式来覆盖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); } }); )和getItem({{1}在你的适配器实现中)

    Offtopic提示:请勿使用小写作为类名return yourListFieldInAdapter.get(pos) =&gt;中的第一个字母getCount ...为了你的理智:)(OMG,OMG,itemDetails是变量或类名)

答案 1 :(得分: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);

答案 2 :(得分:-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);
}