使用ViewHolder类在getview()中设置onClickListener

MAY*_*3AM 2 android listview onclicklistener

我有一个扩展BaseAdapter的自定义列表适配器.我创建了一个holder类来标记我的视图,以避免夸大已经存在的视图.

static class ViewHolder{
    TextView tvName;
    TextView tvDescription;
    Button   btAdd;
}
Run Code Online (Sandbox Code Playgroud)

在我的getView中我有这样的事情:

public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    ViewHolder holder = null;

    if(vi == null){
        vi = inflater.inflate(R.layout.list_row, null);
        holder = new ViewHolder();
        holder.tvName = (TextView)vi.findViewvById(R.id.name);
        holder.tvDescription = (TextView)vi.findViewvById(R.id.desc);
        holder.btAdd = (Button)vi.findViewvById(R.id.btnadd);
    }else{
        holder = (ViewHolder) vi.getTag();
    }

    holder.btnAdd.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.btnAdd.startAnimation(scale);
        holder.tvName.setVisibility(View.GONE);
        }
    });
    return vi;
}
Run Code Online (Sandbox Code Playgroud)

但eclipse从"holder.btnAdd.startAnimation(scale);"获得错误.并说持有人应该是最后的......

我该如何解决?

fll*_*llo 6

你应该得到viewonClick方法如下:

holder.btnAdd.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        v.startAnimation(scale);
    }
});  
Run Code Online (Sandbox Code Playgroud)

View vonClick方法中传递参数.然后,您的方法将附加到您的情况下的视图:holder.btnAdd因此v == holder.btnAdd

更新
我解决这个问题的做法有点愚蠢.这真的很容易,确实你初始化viewHolder,null但你不应该.这就是为什么你不能让你viewHolderfinal:

public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    final ViewHolder holder; // without initialized

    if(vi == null){
        vi = inflater.inflate(R.layout.list_row, null);
        holder = new ViewHolder();
        holder.tvName = (TextView)vi.findViewvById(R.id.name);
        holder.tvDescription = (TextView)vi.findViewvById(R.id.desc);
        holder.btAdd = (Button)vi.findViewvById(R.id.btnadd);
    }else{
        holder = (ViewHolder) vi.getTag();
    }
    holder.btnAdd.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            v.startAnimation(scale);
            holder.tvName.setVisibility(View.GONE);
        }
    });
    return vi;
}
Run Code Online (Sandbox Code Playgroud)

而已!