getView问题设置Listener with position

时间:2014-03-09 18:09:36

标签: android listview

我有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内。这就是为什么我很沮丧。如果必须移动它将成为一个完全不同的解决方案

1 个答案:

答案 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;
        }

});