所以我幾天來一直在玩這個遊戲,而且似乎無法讓它起作用。我有一個顯示片段的活動,並且該片段是我使用ViewPager進行頁面瀏覽的片段列表的成員。片段本身由一個TextView和一個ListView組成。 ListView從自定義適配器填充自身。OnItemSelectedListener在使用自定義適配器的片段中
我想要做的是將一個OnItemSelected事件傳遞迴它處理的片段。對我來說,繼續前進並在此處顯示代碼可能會更好。
這是活動
public class DialogInventory extends FragmentActivity implements OnItemSelectedListener {
ViewPager viewPager;
Pager pager;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.dialog_inventory);
List<Fragment> fragList = new Vector<Fragment>();
fragList.add(Fragment.instantiate(this, FragmentOne.class.getName()));
fragList.add(Fragment.instantiate(this, FragmentTwo.class.getName()));
pager = new Pager(getSupportFragmentManager(), fragList);
viewPager = (ViewPager) findViewById(R.id.pagerMain);
viewPager.setAdapter(pager);
listMain = (ListView) findViewById(R.id.listMain);
listMain.setOnItemSelectedListener(this);
}
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
switch (viewPager.getCurrentItem()) {
case 0:
FragmentOne fragOne = new FragmentOne();
fragOne.onItemSelected(parent, view, pos, id);
break;
case 1:
FragmentTwo fragTwo = new FragmentTwo();
fragTwo.onItemSelected(parent, view, pos, id);
break;
}
}
public void onNothingSelected(AdapterView<?> arg0) {
}
這是片段:
public class FragmentOne extends Fragment implements OnItemSelectedListener {
View view;
ListView listMain;
ArrayList<String> invItems = new ArrayList<String>();
public FragmentOne() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) {
view = inflater.inflate(R.layout.fragment_one, viewGroup, false);
listMain = (ListView) v.findViewById(R.id.listMain);
listMain.setAdapter(new AdapterItem(getActivity().getApplicationContext(),
R.layout.tile_item, invItems));
listMain.setOnItemSelectedListener(this);
return view;
}
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
Log.i("Test", "hit");
}
某些線條爲簡潔起見省略。讓我們假設片段得到正確顯示並且一切正常。唯一不能正常工作的是Activity中的OnItemSelected事件根本沒有觸發......更不用說片段中的OnItemSelected事件。我在這裏做錯了什麼?
編輯:ListViews必須在它們各自的片段中(因爲它們將單獨顯示在不同的活動以及上面列出的活動中)。這裏最大的問題是我無法在我的Activity中設置OnItemSelectedListener,因此事件永遠不會被觸發。我已經完成了所有的代碼,並且正在運行,只是OnItemSelectedListener不起作用。
編輯2:明天我會給這個問題增加一筆賞金。鑑於此,我認爲我會更正確地回答正確答案的範圍。正確的答案不會對UI佈局或演示文稿發生任何重大變化。正確的答案會將OnItemSelected事件傳遞給Fragment並在那裏處理。答案不會讓我在代碼行之後加載我的Activity,以實現我認爲只需幾行就可以完成的事情。更優雅的答案顯然更具吸引力。感謝任何看過這個的人。
這裏的問題是,我在我的活動中得到了NPE。我如何將它指向一個ListView,其佈局不同於它所在類的佈局。
運行打破你的「我不想改變UI」規則的風險,有你沒有使用'ListFragment'它默認給你一個方法,'理由覆蓋',捕獲點擊'ListView',因此你可以做我認爲你正在嘗試做的事情,即處理片段中本地的列表項點擊... http://developer.android.com /reference/android/app/ListFragment.html#onListItemClick(android.widget.ListView,android.view.View,int,long) – 2012-07-20 22:27:55
是的,因爲ListFragment會填滿整個屏幕。在這種情況下,我將在底部有按鈕,並在頂部有一個標題TextView – user1449018 2012-07-21 10:20:41
您似乎有事情背對背:您不應該嘗試捕獲活動中的列表項單擊並將它們傳播到片段( s),而是直接在相關片段中接收它們。基本上@SalilPandit已經給出了正確的方法。你是否使用'ListFragment'取決於你,但是你認爲它「填滿整個屏幕」的假設是不正確的;它只是處理列表的一個便利片段,但您可以使它看起來像任何您想要的,只要您至少用'@android:id/list'聲明瞭一個'ListView'。 – 2012-07-21 23:32:08