RecycleView使用指南
参考文献:
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); //一行四个子项