Android:滑动页面时未触发 OnItemClickListener 事件(FragmentActivity 和 ListFragment)

标签 android onitemclicklistener android-fragmentactivity

我有一个包含 6 个 fragment 的 fragment Activity 。每个 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 有很多问题,但我找不到针对这个特定问题的解决方案。

最佳答案

替换行:

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

与:

listView = getListView();

在第一行代码中,您在父 Activity 中搜索当前 fragment 的 ListView。这适用于第一个 fragment ,因为在那个初始时刻,第一个 fragment 的 ListView 被正确地找到并在您的监听器中使用。当您滑动到第二个 fragment 并再次在父 Activity 中搜索 ListView 时,您将“找到”前一个 fragment 的 ListView(它不在屏幕上,但仍然存在于 ViewPager 中以获得更好的性能)。正是在这个不可见的 ListView 上,您设置了 OnItemClickListener,但实际上您会点击另一个 ListView,您在可见 fragment (并且没有听众)。通过使用 getListView(),您将始终正确引用 fragment 的 ListView。 还有 a ListFragment has its own callback for ListView item clicks我建议使用它而不是自己设置监听器。

关于Android:滑动页面时未触发 OnItemClickListener 事件(FragmentActivity 和 ListFragment),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13531404/

相关文章:

android - 以编程方式添加的 Spinner 的 OnItemSelectedListener 不会触发

android - 自动完成 TextView 和 onitemclick

android - fragment 垃圾收集

android - 使用 android.support.v7.widget.ContentFrameLayout.setDecorPadding 在某些设备上应用程序崩溃

Java/android - 检查字符串 `FileName` 是否包含任何文件名不允许的字符

android - 回收站 View : setOnClickListener not accessing full CardView

android - FragmentActivity#onDetachFragment 在哪里?

android - Fragments 安卓版本<3.0

java - 使用 URL 设置图像失败

android - 在 LinearLayout 中使用权重时如何保持纵横比?