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