如何在自定义适配器的getView()内部设置视图的OnClickListener而不进行回收

时间:2014-01-21 03:47:54

标签: android listview onclicklistener recycle

我有一个自定义适配器,它根据特定列表项是否“有效”来更改视图的alpha。我还需要在用户尝试单击无效项目时显示Toast。不幸的是,由于视图回收,我目前没有看到如何为每个视图设置不同的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();
    }
}

1 个答案:

答案 0 :(得分:0)

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

DevBytes: ListView Animations

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