我有ListView
Adapter
使用LruCache
,因为它是ViewHolder
。我正在尝试从View
内的缓存中检索getView()
并设置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
内。这就是为什么我很沮丧。如果必须移动它将成为一个完全不同的解决方案
答案 0 :(得分:1)
删除view.setOnLongClickListener(new OnLongClickListener()
方法中的getView
,然后return convertView
。在为onLongClickListener
设置adapter
之后设置ListView
:
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;
}
});