[Android:滑动页面时,不会触发OnItemClickListener事件(FragmentActivity和ListFragment)

问题描述 投票:1回答:1

我有一个包含6个片段的Fragment活动。每个片段都是同一类的实例(TalkListFragment-扩展了ListFragment)。现在,在第一页中,单击某个项目后便会触发该事件。一旦刷完另一页,然后单击该项目,则不会发生任何事情。我已经完成了listView.setDescendantFocusability(ListView.FOCUS_BLOCK_DESCENDANTS);,并且在XML文件中也是如此。

这里是代码

    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的问题很多,但我找不到此特定问题的解决方案。

android onitemclicklistener android-fragmentactivity
1个回答
2
投票

替换行:

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

with:

listView = getListView();

使用第一行代码,您在父活动中搜索当前片段的ListView。这适用于第一个片段,因为在初始时刻,第一个片段的ListView已正确找到并在您的侦听器中使用。当您滑动到第二个片段并再次在父活动中搜索ListView时,您将“找到”前一个片段的ListView(不在屏幕上,但仍存在于ViewPager中,以便更好性能)。正是在此不可见的ListView上设置了OnItemClickListener,但实际上您将单击一个不同的ListView,即在可见片段中看到的那个getListView()(没有侦听器)。通过使用ListView,您将始终正确引用片段的a ListFragment has its own callback for ListView item clicks。另外,ListFragment,我建议您使用它,而不要自己设置监听器。

© www.soinside.com 2019 - 2024. All rights reserved.