Android 如何在自定义适配器的getView()中设置视图的OnClickListener而不被回收

Android 如何在自定义适配器的getView()中设置视图的OnClickListener而不被回收,android,listview,onclicklistener,recycle,Android,Listview,Onclicklistener,Recycle,我有一个自定义适配器,它根据特定列表项是否有效来更改视图的alpha。当用户试图单击无效项时,我还需要显示一个祝酒词。不幸的是,由于视图循环,我目前不知道如何为每个视图设置不同的OnClickListener。最终,OnClickListener将应用于列表中的每个项目,不管是否有效 解决这个问题的方法是在super.getView中传入null作为convertView参数。如果可能的话,我真的宁愿避免这样的事情 如果有任何建议,我将不胜感激,谢谢 public class TestAdapt

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

解决这个问题的方法是在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();
    }
}

有一段DevBytes视频专门介绍这个问题

这是关于让正在进行的动画在循环视图上继续,但相同的概念适用于单击侦听器