如何在RecyclerView Adapter中用ViewBinding替换ButterKnife
用ViewBinding替代ButterKnife重构你的MeetingRecyclerViewAdapter
没问题,我来帮你把这个Adapter改成用ViewBinding实现,彻底移除ButterKnife的依赖,让代码更简洁安全。
第一步:先启用ViewBinding
首先确保你在app模块的build.gradle(或build.gradle.kts)中开启了ViewBinding:
// Groovy版本 android { ... buildFeatures { viewBinding true } } // Kotlin DSL版本 android { ... buildFeatures { viewBinding = true } }
第二步:重构后的完整Adapter代码
import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.gallosalocin.mareu.R; import com.gallosalocin.mareu.databinding.CardviewMainBinding; import com.gallosalocin.mareu.model.Meeting; import java.util.List; public class MeetingRecyclerViewAdapter extends RecyclerView.Adapter<MeetingRecyclerViewAdapter.ViewHolder> { private List<Meeting> meetingsList; private OnItemClickListener onItemClickListener; MeetingRecyclerViewAdapter(List<Meeting> meetings, OnItemClickListener onItemClickListener) { this.meetingsList = meetings; this.onItemClickListener = onItemClickListener; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 使用ViewBinding的inflate方法加载布局 CardviewMainBinding binding = CardviewMainBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); return new ViewHolder(binding, onItemClickListener); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Meeting meeting = meetingsList.get(position); String descriptionItems = String.format("%1$s - %2$s - %3$s", meeting.getTopic(), meeting.getTime(), meeting.getRoom()); // 通过binding对象访问控件 holder.binding.ivCardviewImage.setImageResource(meeting.getRoomColor()); holder.binding.tvCardviewDescription.setText(descriptionItems); holder.binding.tvCardviewEmail.setText(meeting.getEmail()); } @Override public int getItemCount() { return meetingsList.size(); } public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { // 持有ViewBinding实例 private final CardviewMainBinding binding; OnItemClickListener onItemClickListener; ViewHolder(@NonNull CardviewMainBinding binding, OnItemClickListener onItemClickListener) { super(binding.getRoot()); this.binding = binding; this.onItemClickListener = onItemClickListener; // 通过binding设置删除按钮的点击监听 binding.ivCardviewDeleteBtn.setOnClickListener(this); } @Override public void onClick(View view) { if (view.getId() == R.id.iv_cardview_delete_btn) { onItemClickListener.onDeleteClick(getAdapterPosition()); } } } public interface OnItemClickListener { void onDeleteClick(int position); } }
关键修改点说明
- 移除ButterKnife相关代码:删掉了
ButterKnife的导入、@BindView注解以及ButterKnife.bind()调用,彻底摆脱第三方依赖 - ViewBinding类的使用:布局
cardview_main.xml会自动生成对应的CardviewMainBinding类,所有控件都可以通过这个类的实例安全访问(编译时检查,避免空指针和id写错的问题) - 布局加载方式变更:在
onCreateViewHolder中使用CardviewMainBinding.inflate()替代传统的LayoutInflater.inflate(),直接得到Binding实例 - 控件访问方式:ViewBinding会把XML中的下划线命名(比如
iv_cardview_image)转为驼峰命名(ivCardviewImage),通过binding.xxx访问控件 - 点击事件绑定:直接通过binding对象获取删除按钮,设置点击监听,代码更直观
这样修改后,代码不仅可读性更高,还能获得编译时的类型安全检查,比ButterKnife更可靠。
内容的提问来源于stack exchange,提问作者gallosalocin
相关产品推荐
相关产品推荐

