如何在ArrayList Adapter中点击按钮获取ListView对应项详情?
嘿,我来帮你搞定这个ListView按钮点击获取对应项详情的问题!
解决ListView按钮点击获取对应项详情的问题
你遇到的核心问题大概率是ListView的视图复用搞的鬼——直接在点击监听器里用getView方法中的position变量,当列表滚动后,这个position可能已经不是你点击的那个项的真实位置了。下面给你两种靠谱的实现方案,优先推荐第一种:
方案1:直接把产品对象绑定到按钮上(最稳妥)
在你的productListadapter(继承自ArrayAdapter<ProductDetails>)的getView方法里,不要依赖position变量,而是把当前项的ProductDetails对象通过setTag()绑定到按钮上,点击时直接从按钮上取对象:
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; // 初始化视图和ViewHolder if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.your_list_item_layout, parent, false); holder = new ViewHolder(); holder.getproductdetailsbutton = convertView.findViewById(R.id.your_button_id); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 获取当前项的产品对象 ProductDetails currentProduct = productList.get(position); // 把产品对象绑定到按钮上 holder.getproductdetailsbutton.setTag(currentProduct); // 设置按钮点击事件 holder.getproductdetailsbutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 从按钮的Tag中取出对应的产品对象 ProductDetails pd = (ProductDetails) v.getTag(); // 这里就可以随意获取详情了,比如pd.getProductId()、pd.getDescription() Log.d("ProductInfo", "你点击的产品是:" + pd.getProductName()); } }); // 这里可以设置列表项的其他内容,比如图片、文本等 // ... return convertView; } // 内部ViewHolder类,用来缓存控件 private static class ViewHolder { Button getproductdetailsbutton; // 可以添加其他控件,比如ImageView productImageView; }
方案2:用final修饰position(备选)
如果你坚持想用position来获取数据,也可以在getView方法里把position声明为final,这样监听器里的position就会固定为当前项的正确位置。不过这种方式在productList发生增删时可能出问题,不如方案1稳妥:
@Override public View getView(final int position, View convertView, ViewGroup parent) { // ... 初始化ViewHolder和视图的代码 ... holder.getproductdetailsbutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 此时的position是当前项的正确位置 ProductDetails pd = productList.get(position); // 处理详情逻辑 } }); // ... 其他代码 ... return convertView; }
为啥不能直接用普通的position?
因为ListView会复用滑出屏幕的视图(也就是convertView),当你滚动列表后,getView里的position会被重新赋值,之前设置的监听器里的position就会指向新复用的项,而不是你点击的那个原始项,导致拿到错误的数据。
内容的提问来源于stack exchange,提问作者RAMKUMAR
相关产品推荐
相关产品推荐

