Search code examples
androidandroid-fragmentsandroid-viewpager

Cannot use getSupportFragmentManager() in RecyclerAdapter


I have a problem with my RecyclerViewAdapter. I want to show my fragments with TabLayout,CardView and ViewPager entegrations. I'm not using Activity, using Fragment. I have a Fragment. And this fragment contains Cardview. And this Cardview contains Tablayout and Viewpager.

How can I use getSupportFragmentManager() in this adapter or how can I edit this adapter? Here is my code:

RecyclerViewAdapter.java

public class RecyclerViewAdapter extends 
RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

    public ArrayList<String> myValues;
    public RecyclerViewAdapter (ArrayList<String> myValues){
        this.myValues= myValues;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View listItem = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_select_area, parent, false);
        return new MyViewHolder(listItem);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return myValues.size();
    } 

    public class MyViewHolder extends RecyclerView.ViewHolder {
            private TextViewPoppins myTextView;
            private TabItem tab_loc,tab_area;
            private ViewPager viewPager;
            private TabLayout tabLayout;

            public MyViewHolder(View itemView)
            {
                super(itemView);
                myTextView = (TextViewPoppins)itemView.findViewById(R.id.select_area);
                tabLayout = (TabLayout) itemView.findViewById(R.id.tabs);
                tab_loc= (TabItem) itemView.findViewById(R.id.tab_loc);
                tab_area= (TabItem) itemView.findViewById(R.id.tab_area);
                tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_location_green));
                tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_kort));
                viewPager = (ViewPager) itemView.findViewById(R.id.viewpager);
                setupViewPager(viewPager);


            }
        }

    private void setupViewPager(ViewPager viewPager)
    {

        ViewPagerAdapter adapter = new 
        ViewPagerAdapter(getSupportFragmentManager()); 
        //this line gives the error.
        adapter.addFragment(new LocationFragment(), "ONE");
        adapter.addFragment(new AreaFragment(), "TWO");
        viewPager.setAdapter(adapter);


    }

    class ViewPagerAdapter extends FragmentPagerAdapter
    {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager)
        {
            super(manager);
        }

        @Override
        public Fragment getItem(int position)
        {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title)
        {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
}

Solution

  • This is what I think you intended to do: ReyclerView -> Fragment -> Activity with TabLayout and ViewPager. This is how you accomplish that: first, the method where you set up your ViewPager and TabLayout ("setupViewPager") should be in an Activity which has the getFragmentManger() or getSupportFragmentManager() if you're using an AppCompatActivity. Your adapter class can be in another file, though.

    Secondly, it also appears you're trying to put your TabLayout and ViewPager in your ViewHolder. ViewHolders are used in RecyclerView lists, not for lateral navigation. Take this code out of the class:

    tabLayout = (TabLayout) itemView.findViewById(R.id.tabs);
    tab_loc= (TabItem) itemView.findViewById(R.id.tab_loc);
    tab_area= (TabItem) itemView.findViewById(R.id.tab_area);
    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_location_green));
    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_kort));
    viewPager = (ViewPager) itemView.findViewById(R.id.viewpager);
    setupViewPager(viewPager);
    

    Finally, here is how it should look in your MainActivity under onCreate:

    // Get the ViewPager and set it's PagerAdapter so that it can display items
    ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
    viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));
    
    // Give the TabLayout the ViewPager
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    

    Here is an additional link reference.