如何在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
相关产品推荐
相关产品推荐

