24.页面多个TabLayout+ViewPager+Fragment效果

//----------------------------------先上效果图

//要实现这样的一个效果,有两种实现方法,多布局和单布局。

//这个效果注意的问题有滑动冲突,和fragment滑动空白问题

//1.---------------------------先说第一种多布局----------------重点都在适配器,直接看适配器

public class Apader extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
//定义三个int类型 用来判断布局
    private int a = 1, b = 2, c = 3;
    private List<String> mList;
    private Context context;

    public Apader(List<String> mList, Context context) {
        this.mList = mList;
        this.context = context;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//holder为空,通过判断viewType,给holder赋值,最后统一返回一个holder
        RecyclerView.ViewHolder holder = null;
        switch (viewType) {
            case 1:
                View inflate = LayoutInflater.from(context).inflate(R.layout.item1, null);
                holder = new ViewHolder1(inflate);
                break;
            case 2:
                View inflate2 = LayoutInflater.from(context).inflate(R.layout.item2, null);
                holder = new ViewHolder2(inflate2);
                break;
            case 3:
                View inflate3 = LayoutInflater.from(context).inflate(R.layout.item3, null);
                holder=new ViewHolder3(inflate3);
                break;
        }
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
//比较holder 是否 是ViewHolder1
        if (holder instanceof ViewHolder1){
            ((ViewHolder1) holder).mText1.setText("初一");
            List<String> mList1=new ArrayList<>();
            List<Fragment>mFragmentList1=new ArrayList<>();
            AFragment aFragment = new AFragment();
            for (int i = 1; i < 7; i++) {
                mList1.add(i+"班");
                mFragmentList1.add(AFragment.newInstance("",""));
            }
//---------这个setOffscreenPageLimit()方法是预加载的意思,为了防止fragment滑动的时候变空白
            ((ViewHolder1) holder).mViewPager1.setOffscreenPageLimit(mList1.size());
            ViewPagerApader viewPagerApader = new ViewPagerApader(((MainActivity)(context)).getSupportFragmentManager(),mList1,mFragmentList1);
            ((ViewHolder1) holder).mViewPager1.setAdapter(viewPagerApader);
            ((ViewHolder1) holder).mTab1.setupWithViewPager(((ViewHolder1) holder).mViewPager1);
        }

//比较holder 是否 是ViewHolder2
        if (holder instanceof ViewHolder2){
            ((ViewHolder2) holder).mText2.setText("初二");
            List<String> mList2=new ArrayList<>();
            List<Fragment>mFragmentList2=new ArrayList<>();
            AFragment aFragment = new AFragment();
            for (int i = 1; i < 7; i++) {
                mList2.add(i+"班");
                mFragmentList2.add(AFragment.newInstance("",""));
            }
//---------这个setOffscreenPageLimit()方法是预加载的意思,为了防止fragment滑动的时候变空白
            ((ViewHolder2) holder).mViewPager2.setOffscreenPageLimit(mList2.size());
            ViewPagerApader viewPagerApader = new ViewPagerApader(((MainActivity)(context)).getSupportFragmentManager(),mList2,mFragmentList2);
            ((ViewHolder2) holder).mViewPager2.setAdapter(viewPagerApader);
            ((ViewHolder2) holder).mTab2.setupWithViewPager(((ViewHolder2) holder).mViewPager2);
        }

//比较holder 是否 是ViewHolder3
        if (holder instanceof ViewHolder3){
            ((ViewHolder3) holder).mText3.setText("初三");
            List<String> mList3=new ArrayList<>();
            List<Fragment>mFragmentList3=new ArrayList<>();
            AFragment aFragment = new AFragment();
            for (int i = 1; i < 7; i++) {
                mList3.add(i+"班");
                mFragmentList3.add(AFragment.newInstance("",""));
            }
//---------这个setOffscreenPageLimit()方法是预加载的意思,为了防止fragment滑动的时候变空白
            ((ViewHolder3) holder).mViewPager3.setOffscreenPageLimit(mList3.size());
            ViewPagerApader viewPagerApader = new ViewPagerApader(((MainActivity)(context)).getSupportFragmentManager(),mList3,mFragmentList3);
            ((ViewHolder3) holder).mViewPager3.setAdapter(viewPagerApader);
            ((ViewHolder3) holder).mTab3.setupWithViewPager(((ViewHolder3) holder).mViewPager3);
        }
    }

//如果RecyclerView的下标是第一个也就是0,的话返回a布局
//如果RecyclerView的下标是第一个也就是1,的话返回b布局
//最后如果RecyclerView的下标是第一个也就是3,的话返回c布局
    @Override
    public int getItemViewType(int position) {
        if (position==0){
            return a;
        }

        if (position==1){
            return b;
        }

        return c;
    }



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

    public static class ViewHolder1 extends RecyclerView.ViewHolder {
        public View rootView;
        public TextView mText1;
        public TabLayout mTab1;
        public ViewPager mViewPager1;

        public ViewHolder1(View rootView) {
            super(rootView);
            this.rootView = rootView;
            this.mText1 = (TextView) rootView.findViewById(R.id.mText1);
            this.mTab1 = (TabLayout) rootView.findViewById(R.id.mTab1);
            this.mViewPager1 = (ViewPager) rootView.findViewById(R.id.mViewPager1);
        }

    }

    public static class ViewHolder2 extends RecyclerView.ViewHolder {
        public View rootView;
        public TextView mText2;
        public TabLayout mTab2;
        public ViewPager mViewPager2;

        public ViewHolder2(View rootView) {
            super(rootView);
            this.rootView = rootView;
            this.mText2 = (TextView) rootView.findViewById(R.id.mText2);
            this.mTab2 = (TabLayout) rootView.findViewById(R.id.mTab2);
            this.mViewPager2 = (ViewPager) rootView.findViewById(R.id.mViewPager2);
        }

    }

    public static class ViewHolder3 extends RecyclerView.ViewHolder{
        public View rootView;
        public TextView mText3;
        public TabLayout mTab3;
        public ViewPager mViewPager3;

        public ViewHolder3(View rootView) {
            super(rootView);
            this.rootView = rootView;
            this.mText3 = (TextView) rootView.findViewById(R.id.mText3);
            this.mTab3 = (TabLayout) rootView.findViewById(R.id.mTab3);
            this.mViewPager3 = (ViewPager) rootView.findViewById(R.id.mViewPager3);
        }

    }
}

//----------------这种多布局其实实现这种效果很简单,写三个布局文件,就实现了

//------------------------这第二种 单布局,其实我感觉单布局比多布局简单,因为只用一个布局文件,不过得注意一个ViewPager的创建问题。

//2.--------------------------第二种 单布局-------------------------------------

public class Apader extends RecyclerView.Adapter<Apader.ViewHolder> {
    private List<String> mList;
    private Context context;

    public Apader(List<String> mList, Context context) {
        this.mList = mList;
        this.context = context;
    }

    private List<String> mList2;
    private List<Fragment>mFragmentList;



    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View inflate = LayoutInflater.from(context).inflate(R.layout.item, null);
        ViewHolder holder=new ViewHolder(inflate);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//---------重点在这里 holder.mViewPager.setId(position+1);这句是创建多个ViewPager
//如果不加这句的话,就只能创建出一个ViewPager的布局,其他两个ViewPager是空的,当然也就滑不动了
        holder.mViewPager.setId(position+1);
                holder.mChuYi.setText(mList.get(position));
                mList2=new ArrayList<>();
                mFragmentList=new ArrayList<>();
                mList2.add("1班");
                mList2.add("2班");
                mList2.add("3班");
                mList2.add("4班");
                mList2.add("5班");
                mList2.add("6班");
//fragment的复用
                AFragment aFragment = new AFragment();
                for (int i = 0; i < mList2.size(); i++) {
                    mFragmentList.add(AFragment.newInstance("",""));
                }
//Viewpager适配器
                ViewPagerApader viewPagerApader = new ViewPagerApader(((MainActivity)(context)).getSupportFragmentManager(),mList2,mFragmentList);
                holder.mViewPager.setOffscreenPageLimit(mFragmentList.size());
                holder.mViewPager.setAdapter(viewPagerApader);
                holder.mTab.setupWithViewPager(holder.mViewPager);

    }



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

    public static class ViewHolder extends RecyclerView.ViewHolder{
        public View rootView;
        public ViewPager mViewPager;
        public TextView mChuYi;
        public TabLayout mTab;

        public ViewHolder(View rootView) {
            super(rootView);
            this.rootView = rootView;
            this.mTab = rootView.findViewById(R.id.mTab);
            this.mViewPager = (ViewPager) rootView.findViewById(R.id.mViewPager);
            this.mChuYi = (TextView) rootView.findViewById(R.id.mChuYi);
        }

    }


}

//---------------------------------------------注意----------------------------------------

//我写的都是RecyclerView适配器,再写适配器里面的数据(也就是页面数据)的时候不可用ListView,最好还用RecyclerView适配

//不然的话就会有滑动冲突,而RecyclerView不会有,因为人家RecyclerView内部已经解决。

//反正最好都用同一种适配器,谨记谨记!

//------------------------------------完--------------------------------------------------

猜你喜欢

转载自blog.csdn.net/weixin_42061754/article/details/81278647