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

京公网安备 11010502036488号