Android RecyclerView对应的适配器中方法的执行顺序和具体作用详解

简介: Android RecyclerView对应的适配器中方法的执行顺序和具体作用详解

1.代码的执行顺序为,首次进入会先调用getItemCount(),返回条目的个数,之后会分别调用

getItemCount 作用:返回条目的个数

getItemViewType 作用:修改相应position的视图类型

onCreateViewHolder 作用:这个方法用于创建条目View

onBindViewHolder 作用:这个方法是用于绑定holder的,一般用来设置数据

具体适配器的代码如下,有具体的注释可以自己理解一下:

/**
 * @Author: ly
 * @Date: 2022/12/10
 * @Description: RecyclerView对应的适配器
 */
public class ExerciseAdapter extends RecyclerView.Adapter<ExerciseAdapter.ExerciseViewHolder> {
    private static final String TAG = "ExerciseAdapter";
    private List<String> stringList = new ArrayList<>();
    public void setStringList(List<String> stringList) {
        this.stringList = stringList;
    }
    /**
     * 这个方法用于创建条目View
     *
     * @param parent   新视图绑定后将添加到其中的ViewGroup
     * @param viewType 视图类型
     * @return 不同的ViewType创建不同的ViewHolder子类
     */
    @NonNull
    @Override
    public ExerciseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Log.e(TAG, "onCreateViewHolder   " + "  viewType: " + viewType);
        ItemExerciseBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_exercise, parent, false);
        return new ExerciseViewHolder(binding);
    }
    /**
     * 这个方法是用于绑定holder的,一般用来设置数据
     *
     * @param holder   判断该holder属于的ViewHolder 为不同的viewType添加不同的绑定方法
     * @param position 对应的条目索引
     */
    @Override
    public void onBindViewHolder(@NonNull ExerciseViewHolder holder, int position) {
        holder.bindData(position);
    }
    /**
     * 返回条目的个数
     *
     * @return
     */
    @Override
    public int getItemCount() {
        Log.e(TAG, "getItemCount");
        return 100;
    }
    /**
     * 修改相应position的视图类型
     *
     * @param position 条目索引
     * @return 默认返回0
     */
    @Override
    public int getItemViewType(int position) {
        Log.e(TAG, "getItemViewType " + "position:" + position);
        return super.getItemViewType(position);
    }
    public class ExerciseViewHolder extends RecyclerView.ViewHolder {
        ItemExerciseBinding binding;
        public ExerciseViewHolder(@NonNull ItemExerciseBinding itemView) {
            super(itemView.getRoot());
            binding = itemView;
        }
        /**
         * 这个方法用于设置数据
         *
         * @param position
         */
        public void bindData(int position) {
            Log.e(TAG, "onBindViewHolder   " + "  position: " + position);
            binding.tvExercise.setText(stringList.get(position));
        }
    }
}

首次进入页面输出的日志为:

getItemCount 这个会先执行一次,之后会依次执行以下四个方法
getItemCount
getItemViewType position:0
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 0
getItemCount
getItemViewType position:1
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 1
getItemCount
getItemViewType position:2
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 2
getItemCount
getItemViewType position:3
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 3
getItemCount
getItemViewType position:4
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 4
getItemCount
getItemViewType position:5
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 5
getItemCount
getItemViewType position:6
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 6
getItemCount
getItemViewType position:7
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 7
getItemCount
getItemViewType position:8
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 8
getItemCount
getItemViewType position:9
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 9
getItemCount
getItemViewType position:10
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 10
getItemCount
getItemViewType position:11
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 11

首次进入加载的条目数,跟手机的屏幕是有关的,我切换为横屏加载的条目数为5条,输出日志如下:

getItemCount
getItemCount
getItemViewType position:0
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 0
getItemCount
getItemViewType position:1
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 1
getItemCount
getItemViewType position:2
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 2
getItemCount
getItemViewType position:3
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 3
getItemCount
getItemViewType position:4
onCreateViewHolder     viewType: 0
onBindViewHolder     position: 4


目录
相关文章
|
3月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
74 2
基于Android P,自定义Android开机动画的方法
|
3月前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
179 2
|
19天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
43 15
Android 系统缓存扫描与清理方法分析
|
2月前
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
168 9
|
2月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
66 8
|
2月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
44 2
|
3月前
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
184 1
|
3月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
413 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
3月前
|
Android开发
Android项目架构设计问题之onFirstItemVisibleChanged方法的调用如何解决
Android项目架构设计问题之onFirstItemVisibleChanged方法的调用如何解决
38 0
|
3月前
|
Java 测试技术 Android开发
Android项目架构设计问题之使用反射调用类的私有方法如何解决
Android项目架构设计问题之使用反射调用类的私有方法如何解决
29 0