【问题标题】:How to set OnClickListener of a view inside of a custom adapter's getView() without being recycled如何在自定义适配器的 getView() 中设置视图的 OnClickListener 而不会被回收
【发布时间】:2014-02-10 11:52:56
【问题描述】:

我有一个自定义适配器,它根据特定列表项是否“有效”来更改视图的 alpha。当用户尝试单击无效项目时,我还需要显示祝酒词。不幸的是,由于视图回收,我目前看不到如何为每个视图设置不同的 OnClickListener。最终 OnClickListener 将应用于列表中的每个项目,无论是否有效。

解决这个问题的“hacky”方法是在 super.getView() 中将 null 作为 convertView 参数传递。如果可能的话,我真的更愿意避免这样的事情。

如果有任何建议,我将不胜感激,谢谢!

public class TestAdapter extends ArrayAdapter<TestModel> {

    class ViewHolder {
        CheckedTextView ctv;

        public ViewHolder(View v) {
            ctv = (CheckedTextView)v.findViewById(android.R.id.text1);
        }
    }

    public TestAdapter(Context context, List<TestModel> testModelList) {
        super(context, R.layout.test_list_item, testModelList);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = super.getView(position, convertView, parent);

        ViewHolder holder = (ViewHolder)v.getTag();
        if (holder == null) {
            holder = new ViewHolder(v);
            v.setTag(holder);
        }

        // Decrease alpha to indicate that the item is invalid.
        holder.ctv.setAlpha(isEnabled(position) ? 1.0f : 0.2f);

        if (!isEnabled(position)) {
            holder.ctv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Show a toast which indicates you tried to select an invalid option.

                    // However, due to view recycling this will eventually apply to
                    // all views in the list.
                }
            });
        }

        return v;
    }

    @Override
     public boolean isEnabled(int position) {
        return getItem(position).isValid();
    }
}

【问题讨论】:

    标签: android listview onclicklistener recycle


    【解决方案1】:

    有一个专门针对这个问题的 DevBytes 视频

    DevBytes: ListView Animations

    这是关于在循环视图上继续播放动画,但同样的概念也适用于点击监听器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多