You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:39:11