2

I've a TabLayout in activity and 2 fragments attached to viewpager. Both fragments will have recyclerview. What I want is to change the layout manager of recyclerview in both fragments from list to grid and vice versa on activity's menu button click. I was thinking of using an interface but was unable to add it to fragments. Is there any way to achieve this?

// Fragment

public class FragOne extends Fragment {

    RecyclerView recycle;
    FragOneAdapter adapter;
    ArrayList<Model> arrayList = new ArrayList<>();

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragone, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        recycle = (RecyclerView) view.findViewById(R.id.recycle);
        preparedata();
        adapter = new FragOneAdapter(arrayList);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL, false);
        recycle.setLayoutManager(mLayoutManager);
        ItemOffsetDecoration itemDecoration = new ItemOffsetDecoration(getActivity(), R.dimen.spacing_normal);
        recycle.addItemDecoration(itemDecoration);
        recycle.setHasFixedSize(true);
        recycle.setAdapter(adapter);
    }

    private void preparedata(){
        Model model = new Model();
        model.setName("Name1");
        model.setMobile("1234567890");
        arrayList.add(model);

        Model model1 = new Model();
        model1.setName("Name2");
        model1.setMobile("1234567891");
        arrayList.add(model1);

        Model model2 = new Model();
        model2.setName("Name3");
        model2.setMobile("1234567892");
        arrayList.add(model2);

        Model model3 = new Model();
        model3.setName("Name4");
        model3.setMobile("1234567893");
        arrayList.add(model3);

        Model model4 = new Model();
        model4.setName("Name5");
        model4.setMobile("1234567894");
        arrayList.add(model4);

        Model model5 = new Model();
        model5.setName("Name6");
        model5.setMobile("1234567890");
        arrayList.add(model5);


    }   



}
// Activity

public class MainActivity extends AppCompatActivity {

    int icon = 0;
    ViewPager viewPager;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("Parallax Tabs");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);


        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

        final CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapse_toolbar);
        collapsingToolbarLayout.setTitleEnabled(false);


    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new FragOne(), "ONE");
        adapter.addFrag(new FragTwo(), "TWO");
        viewPager.setAdapter(adapter);
    }

    static 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 addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

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


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item:
                if(icon==0){
                    icon = 1;
                    item.setIcon(getResources().getDrawable(R.drawable.ic_grid));
                   

                }else if(icon==1){
                    icon = 0;
                    item.setIcon(getResources().getDrawable(R.drawable.ic_list));
                }

                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }

}
Somnath Pal
  • 1,570
  • 4
  • 23
  • 42

3 Answers3

0

In your fragment also you have this method.

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
      switch (item.getItemId()) {
        case R.id.xyz:
       // now change your layout from LinearLayoutManager to GridLayoutManager here
        return true;
      }


      return super.onOptionsItemSelected(item);
    }
Pushpendra
  • 2,791
  • 4
  • 26
  • 49
0

in your both fragment override method onOptionsItemSelected() and inside that based on user selection change Layout. code speak more..see below :

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
       super.onOptionsItemSelected(item);

        //change your layout from linear to grid here

      return true;
    }

upvoted my answer if it help you.

Jaydev Mehta
  • 723
  • 5
  • 4
0

OK, here is what you can do:

GridLayoutManager layoutManager;
RecyclerView recycle;

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   super.onOptionsItemSelected(item);

    layoutManager = new GridLayoutManager(getContext(), 4);
    recycle.setLayoutManager(layoutManager);
    recycler.setItemAnimator(new DefaultItemAnimator());
    recycle.setHasFixedSize(true);
    recycle.setAdapter(adapter);

  return true;
}

I've not attached adapter as you can do that yourself, the integer 4 means how many columns you want. In this case, there will be 4 columns. Check if it helps and let me know. :)

Abhi
  • 2,115
  • 2
  • 18
  • 29
  • Thanks for the answer. I've already implemented it. I was asking how to also change the layout in the adapter. Like for list: R.layout.list_row and for grid: R.layout_grid. I saw a post which shows something similar http://stackoverflow.com/questions/28581712/android-recyclerview-change-layout-file-list-to-grid-onoptionitemselected @Bhavesh – Somnath Pal Dec 26 '16 at 08:26
  • @SomnathPal Just create two different adapters and define layouts in there. Well, glad could help :) – Abhi Dec 26 '16 at 08:28