简体   繁体   中英

Android context menu for ListView in PagerAdapter

I have following class:

public class ChannelsListTabsFragment extends Fragment {

    private SlidingTabLayout mSlidingTabLayout;
    private ViewPager mViewPager;
    public ListChannelsPagerAdapter listChannelsPagerAdapter;
    private ChannelCountriesModel[] tabTitles;
    private Context applicationContext;
    private String session;
    private long time_offset;
    private ListView listViewFragment;

    public static ChannelsListTabsFragment newInstance(String session, ChannelCountriesModel[] tabTitles, long time_offset) {
        ChannelsListTabsFragment fragment = new ChannelsListTabsFragment();
        Bundle args = new Bundle();
        args.putParcelableArray("tabTitles", tabTitles);
        args.putString("session", session);
        args.putLong("time_offset", time_offset);
        fragment.setArguments(args);
        return fragment;
    }

    public ChannelsListTabsFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_tabbet, container, false);
        System.out.println("onCreateView");
        applicationContext = getActivity().getApplicationContext();
        tabTitles = (ChannelCountriesModel[]) getArguments().getParcelableArray("tabTitles");
        session = getArguments().getString("session");
        time_offset = getArguments().getLong("time_offset");

        return inflater.inflate(R.layout.channels_list_tabs_fragment, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
        listChannelsPagerAdapter = new ListChannelsPagerAdapter(session, tabTitles);
        mViewPager.setAdapter(listChannelsPagerAdapter);

        mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs);

        mSlidingTabLayout.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
            @Override
            public int getIndicatorColor(int position) {
                return getResources().getColor(R.color.myred);
            }

            @Override
            public int getDividerColor(int position) {
                return getResources().getColor(R.color.myred);
            }
        });

        mSlidingTabLayout.setViewPager(mViewPager);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        if (v.getId()==R.id.channelList) {
            AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
            Object o = listViewFragment.getItemAtPosition(info.position);
            Channel_Model channelModel = (Channel_Model) o;
            menu.setHeaderTitle(channelModel.getCh_Name());
            String[] menuItems = getResources().getStringArray(R.array.menu);
            for (int i = 0; i<menuItems.length; i++) {
                menu.add(Menu.NONE, i, i, menuItems[i]);
            }
        }
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        if (getUserVisibleHint()) {
            AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
            int menuItemIndex = item.getItemId();
            Object o = listViewFragment.getItemAtPosition(info.position);
            Channel_Model channelModel = (Channel_Model) o;

            switch (menuItemIndex) {
                // Přehrát program
                case 0:
                    Intent Play_Channel=new Intent(applicationContext,Play_Channel.class);
                    Play_Channel.putExtra("channelModel", channelModel);
                    Play_Channel.putExtra("epgModel", channelModel.getEpg_Model_Now());
                    Play_Channel.putExtra("session", session);
                    Play_Channel.putExtra("from_beginning", false);
                    Play_Channel.putExtra("time_offset", time_offset);
                    //Play_Channel.putExtra("channelListFragment", channelListFragment);
                    Play_Channel.putExtra("position", info.position);
                    startActivityForResult(Play_Channel, 110);
                    break;
                // Přehrát program od začátku
                case 1:
                    Intent Play_Channel_From_Beginning=new Intent(applicationContext,Play_Channel.class);
                    Play_Channel_From_Beginning.putExtra("channelModel", channelModel);
                    Play_Channel_From_Beginning.putExtra("epgModel", channelModel.getEpg_Model_Now());
                    Play_Channel_From_Beginning.putExtra("session", session);
                    Play_Channel_From_Beginning.putExtra("from_beginning", true);
                    Play_Channel_From_Beginning.putExtra("time_offset", time_offset);
                    //Play_Channel.putExtra("channelListFragment", channelListFragment);
                    Play_Channel_From_Beginning.putExtra("position", info.position);
                    startActivityForResult(Play_Channel_From_Beginning, 110);
                    break;
                // Archiv
                case 2:
                    Intent ListArchive = new Intent(applicationContext, ListArchive.class);
                    ListArchive.putExtra("channelModel", channelModel);
                    ListArchive.putExtra("session", session);
                    startActivityForResult(ListArchive, 120);
                    break;
                // Zpět
                case 3 :
                    break;
            }
            return true;
        }
        return false;
    }

    class ListChannelsPagerAdapter extends PagerAdapter {
        private ChannelCountriesModel[] tabTitles;
        private String session;
        private ListView listViewInAdapter;

        public ListChannelsPagerAdapter(String session, ChannelCountriesModel[] tabTitles) {
            this.tabTitles = tabTitles;
            this.session = session;
        }

        @Override
        public int getCount() {
            try {
                return tabTitles.length;
            }
            catch (Exception e) {
                //e.printStackTrace();
                return 0;
            }
        }

        @Override
        public boolean isViewFromObject(View view, Object o) {
            return o == view;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return tabTitles[position].getName();
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View rootView = getActivity().getLayoutInflater().inflate(R.layout.channels_list_tabs_pager_item, container, false);
            container.addView(rootView);

            listViewInAdapter = (ListView) rootView.findViewById(R.id.channelList);
            listViewInAdapter.requestFocus();

            Channel_Row_Adapter channel_Row_Adapter =  new Channel_Row_Adapter(listViewInAdapter.getContext(), ((ChannelsListTabs)getActivity()).channelsCountriesMap.get(tabTitles[position].getShortcut()), session);
            listViewInAdapter.setAdapter(channel_Row_Adapter);
            registerForContextMenu(listViewInAdapter);

            listViewInAdapter.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                    try {
                        listViewFragment = listViewInAdapter;
                        getActivity().openContextMenu(v);
                    } catch (Exception e) {}
                }
            });
            return rootView;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }
}

Everything looks well but only until I want to use context menu - it is open last created listview, not for actual page.

How can I do it?

I'm using ListView in PagerAdapter and got the same problem as you.

I finally found out that I was using ArrayList as a global variable when i tried to using that ArrayList to pass the data to ListView Adapter. So when the program goes to instantiateItem(),it would use the same ArrayList.

Maybe it's could help you to figure it out.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM