参考文献:
https://blog.csdn.net/qq_45000228/article/details/100655917

一、RecycleView的优势
1.灵活,只需改变一行代码就可以变化多种不同的布局显示排版,以及如今app中常见的一些很酷炫的动画效果都是由RecycleView实现的。

2.RecyclerView.Adapter,比BaseAdapter做了更好的封装,把BaseAdapter的getView方法拆分成onCreateViewHolder方法和onBindViewHolder方法,强制需要创建ViewHolder,这样的好处就是避免了初学者写性能不佳的代码

二、公司内网研发引入RecycleView报错的玄学问题解决
本地sdk版本:
图片说明
默认引入的版本是recyclerview-v7.28,但是编译会报错不通过“unable to resolve dependency for app@...”,这一问题之前遇到时把全局文件.gradle/gradle.properties最下面四行代理注释掉即可,但这回不行,最后尝试把recycleview的版本下调到27解决。

api 'com.android.support:recyclerview-v7:27.0.2'

在IDE里这一句仍会被标红,但是不影响编译运行了。

三、RecycleView使用常规步骤
1.在app/build.gradle文件的dependencies中添加依赖后,main文件里引入recycleview
2.在整体布局里嵌入recycleview

<android.support.v7.widget.RecyclerView
                android:id="@+id/recycle_list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                ></android.support.v7.widget.RecyclerView>

3.在layout下构建每个子项的布局
4.根据子项布局创建封装的实体类,给适配器适配
5.创建适配器(关键一步!,下一节阐述)
6.主类把数据源适配给适配器

List<Tx> txList = new ArrayList<>();//一个全局的链表
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initTxs();//下面的初始化方法
        RecyclerView recyclerView = findViewById(R.id.recycle_list);//找到RecyclerView控件
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);//布局管理器
        recyclerView.setLayoutManager(layoutManager);
        TxAdapter adapter = new TxAdapter(txList);//适配器对象
        recyclerView.setAdapter(adapter);//设置适配器为上面的对象
    }

    private void initTxs(){
        Lcon i = new Lcon(R.mipmap.lista, "test");
        txList.add(i);
        Lcon j =new Lcon(R.mipmap.listb,"test");
        txList.add(j);
    }

四、适配器代码解读

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {
//该适配器继承字RecyclerView的Adapter适配器
    private List<Lcon> mTxList;//用以将适配完的子项储存的链表,它的泛型是之前的实体类

    static class ViewHolder extends RecyclerView.ViewHolder {
        //内部静态类,用以定义TxApter.View的泛型
        ImageView txImage;
        TextView txName1;//这两个是在子项布局里涉及到具体控件
        View txView;//这个是用于整个子项的控制的控件

        public ViewHolder(View view) {
            super(view);
            txView = view;//这个是整个子项的控件
            txImage = view.findViewById(R.id.list_img);
            txName1 = view.findViewById(R.id.list_txt1);//通过R文件的id查找,找出子项的具体控件
        }
    }

    public ListAdapter(List<Lcon> txList) {//链表的赋值
        mTxList = txList;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//用于创建ViewHolder实例,在这个方法中将子项布局加载进来,然后创建一个ViewHolder实例,并把加载出来的布局传入到 构造函数当中,最后将ViewHolder的实例返回。
//ViewHodelder方法,我的理解就是对某个具体子项的操作,包括对具体控件的设置,包括且不限于点击动作
//ViewGroup parent主要用于调用其整个RecyclerView的上下文
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_icon, parent, false);
        //将子项的布局通过LayoutInflater引入
        final ViewHolder holder = new ViewHolder(view);
        holder.txView.setOnClickListener(new View.OnClickListener() {
 //这里是子项的点击事件,RecyclerView的特点就是可以对子项里面单个控件注册监听,这也是为什么RecyclerView要摒弃ListView的setOnItemClickListener方法的原因
            @Override
            public void onClick(View v) {
                Lcon tx = mTxList.get(holder.getAdapterPosition());
                Toast.makeText(v.getContext(), "测试", Toast.LENGTH_LONG).show();
            }
        });
        return holder;//返回一个holder对象,给下个方法使用
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
//用于对 RecyclerView子项的数据进行赋值的,会在每个子项被滚动到屏幕内的时候执行
//通过position参数得到当前实例,再把数据设置到ImageView和TextView中
        Lcon tx = mTxList.get(position);//创建前面实体类的对象
        holder.txImage.setImageResource(tx.getiId());
        holder.txName1.setText(tx.getiName1());//将具体值赋予子项对应的控件
    }

    @Override
    public int getItemCount() {
        //用于告诉RecyclerView一共有多少子项,直接返回数据源的长度就可以,即这里使用的链表长度(size)
        return mTxList.size();
    }
}

五、使用RecycleView实现GridView、ListView的区别
调用布局管理器时,一行代码就可以轻松改变listview还是gridview

LinearLayoutManager layoutManager_list = new LinearLayoutManager(this);//listview
GridLayoutManager layoutManager = new GridLayoutManager(this, 4); //一行四个子项