我有一个包含 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/