ListView 与 RecyclerView 你应该弄懂的都在这里了
public ListViewAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
/**
获取的数据存储在这个集合中,一般来说这个集合中存储了子项的 item
*/
private List mList = new ArrayList();
/**
@return 返回集合的大小
*/
@Override
public int getCount() {
return mList.size();
}
/**
@param position
@return 返回具体的 item
*/
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
/**
作用:加载 子项 item 的布局
@param position item 的位置
@param convertView item 进行复用,避免一个 item 发生多次加载的情况
@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 不为空,直接进行复用
holde
r = (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);
评论