Android基础知识之RecyclerView基本使用和嵌套使用方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c_he_n/article/details/83927236

1.背景介绍

最近在做一个项目,需要展示的效果如下:
按照类型去分组展示,但是针对特定的类型,又有不同的来源,单击来源进行加载相应的数据。
总共有三种类型,分三种标签,标题one,水平滚动recyclerview和标题three,在第二标签下需要分不同数据来源,用户单击不同的来源进行加载。
在这里插入图片描述

2.准备工作

在build.gradle中添加下面的依赖:

implementation 'com.android.support:recyclerview-v7:28.0.0'

3.技术简介

整体采用recyclerview实现分组的展示,设置两种类型,一种标题类型,一种是item展示类型,为了能够更好的展示,我新增了一个类型,这个类型为了展示数据来源的。
在MultiItemViewHolder添加一个recyclerview 视图,展示数据来源的数据,并监听click事件,来实现不同数据源切换和刷新。

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<CommonData> commonDataList;
    private Context context;

    public MyAdapter(Context context, List<CommonData> commonDataList) {
        this.commonDataList = commonDataList;
        this.context = context;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        switch (viewType) {
            case CommonData.TYPE_ONE:
            case CommonData.TYPE_THR:
                return new CommonViewHolder(LayoutInflater.from(context).inflate(R.layout.title_layout_main, viewGroup, false));
            case CommonData.TYPE_CONTENT:
                return new CommonViewHolder(LayoutInflater.from(context).inflate(R.layout.content_layout_main, viewGroup, false));
            case CommonData.TYPE_TWO:
                return new MultiItemViewHolder(LayoutInflater.from(context).inflate(R.layout.multi_item_layout, viewGroup, false));
        }
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
        int type = getItemViewType(position);
        switch (type) {
            case CommonData.TYPE_ONE:
            case CommonData.TYPE_THR:
            case CommonData.TYPE_CONTENT://内容和标题展示,只是内容和标题采用的是一个布局。
                ((CommonViewHolder) viewHolder).bindData(commonDataList.get(position));
                break;
            case CommonData.TYPE_TWO://嵌套recyclerview的地方
                ((MultiItemViewHolder) viewHolder).bindData(commonDataList.get(position));
                break;
        }
    }

    @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        GridLayoutManager linearLayoutManager = new GridLayoutManager(context, 4);
        linearLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int i) {
                switch (getItemViewType(i)) {
                    case CommonData.TYPE_ONE:
                    case CommonData.TYPE_TWO:
                    case CommonData.TYPE_THR:
                        return 4;
                    case CommonData.TYPE_CONTENT:
                        return 1;
                }
                return 1;
            }
        });
        recyclerView.setLayoutManager(linearLayoutManager);
    }

    /**
     * 刷新数据
     *
     * @param list
     */
    public void refresh(List<CommonData> list) {
        commonDataList.clear();
        commonDataList.addAll(list);
    }

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

    @Override
    public int getItemViewType(int position) {
        return commonDataList.get(position).getType();
    }
}

MultiItemViewHolder.class

public class MultiItemViewHolder extends BaseViewHolder<CommonData> {
    private RecyclerView recyclerView;
    private TextView textView;
    
    public MultiItemViewHolder(@NonNull View itemView) {
        super(itemView);
        recyclerView = itemView.findViewById(R.id.multi_item_recylerview);
        textView = itemView.findViewById(R.id.title);
    }

    @Override
    public void bindData(CommonData commonData) {
        textView.setText((String) commonData.getData());
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(recyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(linearLayoutManager);
        SelfAdapter selfAdapter = new SelfAdapter(getData(), itemView.getContext());
        recyclerView.setAdapter(selfAdapter);
    }

    /**
     * 数据源,为了方便,在这里写的测试数据
     *
     * @return
     */
    private List<CommonData> getData() {
        List<CommonData> temp = new ArrayList<>();
        for (int index = 0; index < 10; index++) {
            temp.add(new CommonData("数据来源" + index, CommonData.TYPE_TWO));
        }
        return temp;
    }

    /**
     * 数据源的adapter
     */
    class SelfAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

        List<CommonData> list;
        Context context;

        public SelfAdapter(List<CommonData> list, Context context) {
            this.list = list;
            this.context = context;
        }

        @NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            return new SelfViewHolder(LayoutInflater.from(context).inflate(R.layout.new_title_layout_main, viewGroup, false));
        }

        @Override
        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
            ((SelfViewHolder) viewHolder).bindData(list.get(i));
        }

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

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public void setHasStableIds(boolean hasStableIds) {
            super.setHasStableIds(true);
        }
    }

    class SelfViewHolder extends BaseViewHolder<CommonData> {
        TextView textView;

        public SelfViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.tv_title);
        }

        @Override
        public void bindData(final CommonData commonData) {
            textView.setText((String) commonData.getData());
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    itemView.setEnabled(false);
                    if (v.getContext() instanceof MainActivity) {//更新数据
                        Message msg = Message.obtain();
                        msg.what = 1;
                        msg.obj = getAdapterPosition();
                        ((MainActivity) v.getContext()).handler.sendMessage(msg);
                    }
                }
            });
        }
    }
}

Demo版源码

猜你喜欢

转载自blog.csdn.net/c_he_n/article/details/83927236