问题描述
我有一个带Adapter
的ListView
,它使用LruCache
作为ViewHolder
。
我正在尝试从getView()
内的缓存中检索View
,并设置onLongClickListener
。
但是,尽管我付出了很多努力,但我似乎每次都获得了缓存中的最后一个索引。
适配器
private class MyAdapter extends BaseAdapter {
private LruCache<Integer, View> mViewCache;
private Context mContext;
private LayoutInflater mInflater;
private MyAdapter(Context context) {
mContext = context;
mInflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mViewCache = new LruCache<Integer, View>(10);
}
private View inflateMyView(ViewGroup parent, View view) {
view = mInflater.inflate(R.layout.my_row, null);
return view;
}
getView
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = mViewCache.get(position);
if (view == null) {
view = inflateMyView(parent, null);
mViewCache.put(position, view);
}
...
...
view.setOnLongClickListener(new OnLongClickListener() {
因此,您现在可以看到,我的onLongClickListener
仅适用于我添加到列表中的最后一个项目(缓存中的最后一个索引)。
我需要列表中的每个项目都具有此Listener
,而不仅仅是最后一个。
感谢您的帮助,我一直盯着这个时间太久了。
编辑(仅供参考)
由于此代码的紧密耦合性质,因此onLongClickListener
必须保留在getView
。
这就是为什么我如此沮丧。
如果必须这样做,它将变成完全不同的解决方案
1楼
在getView
方法中删除view.setOnLongClickListener(new OnLongClickListener()
,并使其return convertView
。在为ListView
设置adapter
后,设置onLongClickListener
:
listView.setAdapter(new MyAdapter(this));
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
return false;
}
});