2013-09-25 57 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); 
相關問題