2013-09-25 27 views
0

在我的(第一)Android应用程序中,我有一个项目列表。每个项目都使用item.xml显示,其中我有一个RelativeLayout。在这种布局中,我定义android:onClick="showItemDetails"其中的方法是这样的:如何让Android列表项传递id到下一个视图?

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类?欢迎所有提示!

+2

不使用'安卓:onClick'('查看。 OnClickListener'实现)...使用'ListView/AdapterView.OnItemClickListener'实现,而不是重写适配器的'getItemId'并返回'rowItemsss.get(position).id' th在'AdapterView.OnItemClickListener.onItemClick(...)'实现你会得到你的id在'id' arg – Selvin

+0

@Selvin:这是一个答案,而不是评论 – gunar

+0

@gunar,你可以看到,写好答案需要一个时间:) – Selvin

回答

2

一是一些假设:

  • 你不使用Fragments只是简单Activity称为OuterActivityClass
  • rowItem var有typ
  • ItemListAdapter是扩大ArrayAdapter<RowItemClass>
  • 你这样做的“正确”(ItemListAdapter没有自己List<RowItemClass>领域,getView(...)rowItem被分配了类似的rowItem = getItem(possition);不喜欢rowItem = yourListFieldInAdapter.get(position);(我不知道为什么使用这样的领域,因为ArrayAdapter<?> PPLS已经有它在内部)...如果你这样做“坏”在我的答案与yourListFieldInAdapter.get(position)
  • RowItemClass id字段更换所有getItem(possition)发生较长或INT(如果不使用“或”版本)

你要做的:

  1. 得到来自item.xml
  2. 覆盖hasStableIds()ItemListAdapter摆脱:public boolean hasStableIds() { return true; }
  3. 覆盖getItemId(...)适配器:public long getItemId (int position) { return getItem(position).id; }ActivityonCreate(...)获取的ListView
  4. 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); 
    } 
}); 
不使用:0

用第二种方法,你可以(如果你使用的是“坏”的方式remeber覆盖getItemreturn yourListFieldInAdapter.get(pos))和getCount return yourListFieldInAdapter.size())在适配器中实现)

Offtopic提示省略点2和3。较低的情况下,在类名itemDetails =>ItemDetails第一个字母......为自己的清醒:)(OMG,OMG,itemDetails是变量或类名)

+0

太棒了!我快到了!我唯一没有得到的是OuterActivityClass应该是什么? – kramer65

+1

你有类扩展活动与'showAllOverviewEvents' ...你应该用这个类的名称替换OuterActivityClass ...因为这在anonymouse OnItemClickListener实现类型的OnItemClickListener不是外部类:类Outer {类Inner {void Method(){/ *这里表示内部实例,但Outer.this表示外部实例* /}}}' – Selvin

+0

非常感谢!这真的很棒!你救了我的一天! :d – kramer65

-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); 
} 
+0

它甚至不会编译如果rowItem不是最终的getView ... – Selvin

+0

@Selvin - 你会怎么建议呢? – kramer65

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); 
相关问题