-
@param parent 父容器,根据具体的情况而定
-
@return item
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null){
convertView = mInflater.inflate(R.layout.activity_detail,parent,false);
}
//对 item 进行复用,返回 convertView
return convertView;
}
}
ListView 的优化
可以看到,基本上每一个 item 都需要在 getView() 中加载,如果 item 的数量过多,就会产生性能问题,影响用户体验。这个时候我们就需要使用 ViewHolder(开发者自定义类),这是 ListViewAdapter 的内部类,它的代码如下:
/**
-
作用:加载 子项 item 的布局
-
@param position item 的位置
-
@param convertView item 进行复用,避免一个 item 发生多次加载的情况
-
@param parent 父容器,根据具体的情况而定
-
@return item
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null){
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.activity_detail,parent,false);
convertView.setTag(holder);
} else {
如果 convertView 不为空,直接进行复用
holder = (ViewHolder) convertView.getTag();
}
//对 item 进行复用,返回 convertView
return convertView;
}
//这是一个内部类
private class ViewHolder{
//获取 item 的控件都定义在这里
}
好了,关于 ListView 就到这里了,下面总结两个关键点:
-
自定义 ListViewAdapter ,继承 BaseAdapter。
-
自定义 ViewHolder 和 convertView 一起完成复用优化工作。
下面开始写 RecyclerView ,先把 RecyclerView 的关键点总结在这里。其实和 ListView 是差不多的,主要有两条:
-
RecyclerViewAdapter 继承 Recyclerview.Adapter ,其内部类 ViewHolder 继承 RecyclerView.ViewHolder。
-
设置布局管理器,控制布局效果
RecyclerView 适配器
先看下面 RecyclerView 适配器的代码:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
/**
-
这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。
-
该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,
-
当然这个ViewHolder需要我们自己去编写。
-
@param parent
-
@param viewType
-
@return viewHolder
*/
@NonNull
@Override
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
/**
-
这个方法主要用于适配渲染数据到View中,
-
方法提供给你了一viewHolder而不是原来的convertView
-
@param holder
-
@param position
*/
@Override
public void onBindViewHolder(@NonNull RecyclerViewAdapter.ViewHolder holder, int position) {
//在这里更新 UI
}
/**
- @return 返回 item 的数量
*/
@Override
public int getItemCount() {
return 0;
}
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}
从基础使用上看,我们明显可以看出,RecyclerView 相比 ListView 在基础使用上的区别主要有如下几点:
-
ViewHolder 的编写规范化了。
-
RecyclerView 复用 item 的工作 Google 全帮你搞定了,不需要再像 ListView 那样自己调用 setTag()。
-
RecyclerView 需要设置 KayoutManager
如何在 Activity 中使用 RecyclerView
接下来看一下如何在 Activity 中使用 RecyclerView :(ListView 大致相同)
//1、设置布局管理器
LinearLayoutManager manager = new LinearLayoutManager(this);
RecyclerView recyclerView = findViewById(R.id.detail_rv);
recyclerView.setLayoutManager(manager);
//2、设置适配器
RecyclerViewAdapter adapter = new RecyclerViewAdapter();
recyclerView.setAdapter(adapter);
RecyclerView 的布局管理器
关于 RecyclerView ,还得再说一下它的布局管理器,RecyclerView 提供了三种布局管理器可供选择:
-
LinerLayoutManager 以垂直或者水平列表方式展示
-
GridLayoutManager 以网格方式展示item
erViewAdapter adapter = new RecyclerViewAdapter();
recyclerView.setAdapter(adapter);
RecyclerView 的布局管理器
关于 RecyclerView ,还得再说一下它的布局管理器,RecyclerView 提供了三种布局管理器可供选择:
-
LinerLayoutManager 以垂直或者水平列表方式展示
-
GridLayoutManager 以网格方式展示item