2012-11-23 28 views
1

我有一個包含6個片段的片段活動。每個片段都是同一個類的實例(TalkListFragment - 它擴展了ListFragment)。現在在第一頁中,當一個項目被點擊時,該事件被觸發。一旦另一個頁面被刷新,然後點擊該項目什麼都不會發生。我也在XML文件中完成了listView.setDescendantFocusability(ListView.FOCUS_BLOCK_DESCENDANTS);和相同的操作。Android:OnItemClickListener事件不會觸發頁面(FragmentActivity和ListFragment)

下面是代碼

public class TalkFragmentListActivity extends FragmentActivity implements OnClickListener, OnPageChangeListener 
{ 
    private SwipePagerAdapter pageAdapter = null; 
    private ViewPager viewPager = null; 
     . 
     . 
      private void initializePaging() 
    { 
     foodFragment = new TalkListFragment(); 
     foodFragment.setTitle("Food"); 
     foodFragment.setUrl(""); 
     shoppingFragment = new TalkListFragment(); 
     shoppingFragment.setTitle("Shopping"); 
     shoppingFragment.setUrl(""); 
     eventsFragment = new TalkListFragment(); 
     eventsFragment.setTitle("Events"); 
     eventsFragment.setUrl(""); 
     nightlifeFragment = new TalkListFragment(); 
     nightlifeFragment.setTitle("Night Life"); 
     nightlifeFragment.setUrl(""); 
     serviceFragment = new TalkListFragment(); 
     serviceFragment.setTitle("Service"); 
     serviceFragment.setUrl(""); 
     conceirgeFragment = new TalkListFragment(); 
     conceirgeFragment.setTitle("Conceirge"); 
     conceirgeFragment.setUrl(""); 

     pageAdapter = new SwipePagerAdapter(getSupportFragmentManager()); 
     pageAdapter.addFragment(foodFragment); 
     pageAdapter.addFragment(shoppingFragment); 
     pageAdapter.addFragment(eventsFragment); 
     pageAdapter.addFragment(nightlifeFragment); 
     pageAdapter.addFragment(serviceFragment); 
     pageAdapter.addFragment(conceirgeFragment); 

     viewPager = (ViewPager) super.findViewById(R.id.talk_list_pager); 

     viewPager.setAdapter(this.pageAdapter); 
     viewPager.setOffscreenPageLimit(2); 
     viewPager.setCurrentItem(0); 

     viewPager.setOnPageChangeListener(this); 
    } 

這裏的TalkListClass:

public class TalkListFragment extends ListFragment implements OnClickListener, OnItemClickListener 
    { 
     private TalkListAdapter adapter = null; 
     private ListView listView = null; 
      . 
      . 
       @Override 
      public void onActivityCreated(Bundle savedInstanceState) 
      { 
       super.onActivityCreated(savedInstanceState); 

       TalkFragmentListActivity activity = (TalkFragmentListActivity) getActivity(); 
       adapter = new TalkListAdapter(activity, R.layout.talks_fragment_item, getTalkList()); 
       listView = (ListView) activity.findViewById(android.R.id.list); 
     //  listView = (ListView) activity.findViewById(R.id.talk_items_listview); 
       setListAdapter(adapter); 
       listView.setOnItemClickListener(this); 
       listView.setDescendantFocusability(ListView.FOCUS_BLOCK_DESCENDANTS); 
............. 
} 


    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    { 
     if (listView != null) 
     { 
      TalkListAdapter adptr = (TalkListAdapter) parent.getAdapter(); 
      Talk talk = (Talk) adptr.getItem(position); 
      Intent i = new Intent(view.getContext(), TalkDetailActivity.class); 
      i.putExtra("talk", talk); 
      this.startActivity(i); 
     } 
    } 

現在程序表現良好的第一頁上,但是當頁面刷卡然後ItemOnClick永遠不會奏效。 ItemClickListener有很多問題,但我找不到解決這個問題的方法。

謝謝。

+0

而不是在'Activity'中搜索'ListView'嘗試這一行'listview = getListView();'看看它是怎麼回事。 – Luksprog

+0

哇! Luksprog非常感謝。有效。有什麼不同? –

回答

2

將行:

listView = (ListView) activity.findViewById(android.R.id.list); 

有:

listView = getListView(); 

隨着第一行代碼你在當前片段的ListView父活動搜索。這適用於第一個片段,因爲在第一個片段中,第一個片段的ListView已在您的偵聽器中正確找到並使用。當您滑動到第二個片段並在父活動中再次搜索ListView時,您將「找到」前一個片段的ListView(它不在屏幕上,但仍存在於ViewPager以獲得更好的性能)。它在這個不可見的ListView中,您設置了OnItemClickListener,但實際上您會點擊不同的ListView您在可見片段中看到的(並且沒有偵聽器)。通過使用getListView(),您始終可以正確引用片段的ListView。 也a ListFragment has its own callback for ListView item clicks和我會建議使用,而不是自己設置監聽器。

+2

想說的一樣,但你在哪裏更快:)好awnser! – safari