使用RecyclerView实现多样式item布局

3,566 阅读1分钟

实现效果

项目地址

实现原理

  1. step1:根据需要写出4个item布局文件,在Adapter里设置4个常量用于getItemViewType()区分item 传递给onCreateViewHolder()加载不同item布局。

  2. step2:创建Adapter文件具体实现看以下代码

public class MyRecycleViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private final Context context;
    //布局标识集合
    private final List<Integer> typeList;


    //设置常量
    private static final int TYPE_THREE = 3;
    private static final int TYPE_TWO = 2;
    private static final int TYPE_ONE = 1;
    private static final int TYPE_FOUR = 4;


    public MyRecycleViewAdapter(Context context, List<Integer> typeList) {
        this.context = context;
        this.typeList = typeList;

    }


    @Override
    public int getItemViewType(int position) {
        if (typeList.get(position) == 1) {
            return TYPE_THREE;
        } else if (typeList.get(position) == 0) {
            return TYPE_TWO;
        } else if (typeList.get(position) == 2) {
            return TYPE_ONE;
        } else if (typeList.get(position) == 3) {
            return TYPE_FOUR;
        }
        return 1;
    }


    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == TYPE_THREE) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item3, parent, false);
            ThreeViewHolder threeViewHolder = new ThreeViewHolder(view);
            return threeViewHolder;
        } else if (viewType == TYPE_TWO) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item2, parent, false);
            TwoViewHolder recyclerViewHolder = new TwoViewHolder(view);
            return recyclerViewHolder;
        } else if (viewType == TYPE_ONE) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item1, parent, false);
            OneViewHolder recycleViewHolderOne = new OneViewHolder(view);
            return recycleViewHolderOne;
        } else if (viewType == TYPE_FOUR) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item4, parent, false);
            FourViewHolder recycleViewHolderFour = new FourViewHolder(view);
            return recycleViewHolderFour;
        }

        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {


        switch (holder.getItemViewType()) {

            case TYPE_ONE:


                break;

            case TYPE_TWO:
                TwoViewHolder twoViewHolder = (TwoViewHolder) holder;

                twoViewHolder.banner.setAdapter(new ImageAdapter(DataBean.getTestData3(),context));

                twoViewHolder.banner.setIndicator(new CircleIndicator(context));
                twoViewHolder. banner.setOnBannerListener(new OnBannerListener() {
                    @Override
                    public void OnBannerClick(Object data, int position) {
                        Toast.makeText(context, "点击" + position, Toast.LENGTH_SHORT).show();

                        context.startActivity(new Intent(context, Main2Activity.class));

                    }
                    @Override
                    public void onBannerChanged(int position) {

                    }
                });
                twoViewHolder.banner.setIndicatorGravity(IndicatorConfig.Direction.CENTER);
                twoViewHolder.banner.setOrientation(Banner.VERTICAL);
                twoViewHolder.banner.start();

                break;

            case TYPE_THREE:

                ThreeViewHolder threeViewHolder = (ThreeViewHolder) holder;

                Videoadapter videoadapter=new Videoadapter(context);
                StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.HORIZONTAL);
                threeViewHolder.rv_3.setLayoutManager(staggeredGridLayoutManager);
                threeViewHolder.rv_3.setAdapter(videoadapter);

                break;

            case TYPE_FOUR:
                List<SwipeCardBean> mDatas = SwipeCardBean.initDatas();
                FourViewHolder fourViewHolder = (FourViewHolder) holder;
                fourViewHolder.recyclerView.setLayoutManager(new OverLayCardLayoutManager());
                Myadapter myadapter=new Myadapter( mDatas,context);
                fourViewHolder.recyclerView.setAdapter(myadapter);

                CardConfig.initConfig(context);
                ItemTouchHelper.Callback callback = new RenRenCallback(fourViewHolder.recyclerView, myadapter, mDatas);
                ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
                itemTouchHelper.attachToRecyclerView(fourViewHolder.recyclerView);

                break;


        }


    }

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

    public class ThreeViewHolder extends RecyclerView.ViewHolder {
        RecyclerView rv_3;
        public ThreeViewHolder(View itemView) {
            super(itemView);
            rv_3=itemView.findViewById(R.id.rv_3);
        }

    }

    public class TwoViewHolder extends RecyclerView.ViewHolder {
        public Banner banner;
        public TwoViewHolder(View itemView) {
            super(itemView);
            banner=itemView.findViewById(R.id.banner);

        }

    }

    public class OneViewHolder extends RecyclerView.ViewHolder {


        public OneViewHolder(View itemView) {
            super(itemView);

        }

    }


    public class FourViewHolder extends RecyclerView.ViewHolder {
        RecyclerView recyclerView;
        public FourViewHolder(View itemView) {
            super(itemView);
            recyclerView=itemView.findViewById(R.id.rv_1);
        }

    }
}
  1. step3:在activity中使用recyclerview
 MyRecycleViewAdapter adapter = new MyRecycleViewAdapter(this, typeList);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
        recyclerView.setAdapter(adapter);
        initParam();
        adapter.notifyDataSetChanged();