写点什么

ListView 与 RecyclerView 你应该弄懂的都在这里了

用户头像
Android架构
关注
发布于: 刚刚

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


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


r = (ViewHolder) convertView.getTag();


}


//对 item 进行复用,返回 convertView


return convertView;


}


//这是一个内部类


private class ViewHolder{


//获取 item 的控件都定义在这里


}


好了,关于 ListView 就到这里了,下面总结两个关键点:


  • 自定义 ListViewAdapter ,继承 BaseAdapter。

  • 自定义 ViewHolder 和 convertView 一起完成复用优化工作。


RecyclerView 相关






下面开始写 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);

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
ListView 与 RecyclerView 你应该弄懂的都在这里了