Android: событие OnItemClickListener не запускается при пролистывании страницы (FragmentActivity и ListFragment)

У меня есть активность Fragment, которая содержит 6 фрагментов. Каждый фрагмент является экземпляром одного и того же класса (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, но я не могу найти решение этой конкретной проблемы.


person Sardar Faisal    schedule 23.11.2012    source источник
comment
Вместо того, чтобы искать ListView в Activity, попробуйте эту строку listview = getListView(); и посмотрите, как она работает.   -  person user    schedule 23.11.2012
comment
УХ ТЫ! Люкспрог большое спасибо. Это сработало. Какая разница?   -  person Sardar Faisal    schedule 23.11.2012


Ответы (1)


Замените строку:

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

с участием:

listView = getListView();

С помощью первой строки кода вы ищете в родительской активности текущий фрагмент ListView. Это работает для первого фрагмента, потому что в этот начальный момент ListView первого фрагмента правильно найден и используется в вашем слушателе. Когда вы перейдете ко второму фрагменту и снова ищете ListView в родительской активности, вы «найдёте» предыдущий фрагмент ListView (которого нет на экране, но он всё ещё существует в ViewPager для лучшей производительности). Именно на этот невидимый ListView вы устанавливаете OnItemClickListener, но на самом деле вы нажимаете на другой ListView тот, который вы видите в видимом фрагменте (и у которого нет слушателя). Используя getListView(), вы всегда будете иметь правильную ссылку на ListView фрагмента. Также у ListFragment есть собственный обратный вызов для ListView кликов по элементам, и я бы рекомендовал использовать его, а не устанавливать прослушиватель самостоятельно.

person user    schedule 23.11.2012