当前位置: 代码迷 >> Android >> getView在设置监听器位置时出现问题
  详细解决方案

getView在设置监听器位置时出现问题

热度:56   发布时间:2023-08-04 12:28:40.0

我有一个带AdapterListView ,它使用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 这就是为什么我如此沮丧。 如果必须这样做,它将变成完全不同的解决方案

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

});