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

如何在Android Java开发的ListView中使用ViewBinding

在Android ListView中使用ViewBinding的实现方法

整体逻辑和你已经掌握的RecyclerView ViewBinding用法高度相似,核心是在BaseAdapter的getView方法中复用Binding实例,避免重复inflate布局。


1. 前置配置

首先确保模块级build.gradle已经开启ViewBinding功能(AGP 3.6及以上版本支持):

android {
    buildFeatures {
        viewBinding true
    }
}

假设你的列表项布局文件为item_list_view.xml,构建后会自动生成对应的Binding类ItemListViewBinding。


2. 自定义Adapter实现

直接在getView中处理Binding的创建与复用即可,示例采用Kotlin编写:

class MyListViewAdapter(
    private val context: Context,
    private val dataList: List<String>
) : BaseAdapter() {

    override fun getCount(): Int = dataList.size

    override fun getItem(position: Int): Any = dataList[position]

    override fun getItemId(position: Int): Long = position.toLong()

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        val binding: ItemListViewBinding
        if (convertView == null) {
            // 首次加载时创建Binding实例
            binding = ItemListViewBinding.inflate(LayoutInflater.from(context), parent, false)
            // 将Binding实例绑定到根View的tag中用于后续复用
            binding.root.tag = binding
        } else {
            // 直接复用已有的Binding实例
            binding = convertView.tag as ItemListViewBinding
        }

        // 控件赋值逻辑和RecyclerView中完全一致
        val currentItem = dataList[position]
        binding.tvItemContent.text = currentItem
        // 其余控件赋值、点击事件等逻辑都可通过binding实例直接操作

        return binding.root
    }
}

如果使用Java开发,逻辑完全一致,仅语法稍有区别:

public class MyListViewAdapter extends BaseAdapter {
    private Context context;
    private List<String> dataList;

    public MyListViewAdapter(Context context, List<String> dataList) {
        this.context = context;
        this.dataList = dataList;
    }

    @Override
    public int getCount() {
        return dataList.size();
    }

    @Override
    public Object getItem(int position) {
        return dataList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ItemListViewBinding binding;
        if (convertView == null) {
            binding = ItemListViewBinding.inflate(LayoutInflater.from(context), parent, false);
            binding.getRoot().setTag(binding);
        } else {
            binding = (ItemListViewBinding) convertView.getTag();
        }
        // 控件赋值
        String currentItem = dataList.get(position);
        binding.tvItemContent.setText(currentItem);
        return binding.getRoot();
    }
}

注意事项

  • 复用逻辑和传统ListView的ViewHolder模式完全等价,不会产生额外性能损耗
  • 不需要手动处理控件的空指针校验,ViewBinding会自动完成布局中所有存在id的控件的绑定
  • 无需额外引入ViewHolder类,Binding实例本身就可以替代ViewHolder的作用

内容的提问来源于stack exchange,提问作者Talha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:24:03