使用 final 关键字访问 onClick() 方法内部的 convertView

问题描述

最近我开始学习listViews,目前我正在尝试为列表中的每个项目实现功能按钮。一切正常。在“onClick()”方法内部,我可以调用一个吐司,它给出有关其按钮被点击的项目的具体信息。

我一直在尝试并发现能够通过按下按钮来更改每个项目的可绘制对象(背景)会很酷。这似乎是一件容易的事。我以为我所要做的就是对“convertView”对象使用“setBackgroundResource()”方法。但是我收到一条错误消息“变量‘convertView’是从内部类访问的,需要声明为final”。另外我有一个建议“将'convertView'复制到最终的临时变量”。这就是我所做的。因此,现在我在“onClick”方法内部使用了“finalConvertView.setBackgroundResource()”而不是“convertView.setBackgroundResource()”,一切正常,应用程序按预期运行。

我的问题是有什么不同,有什么变化?另外,为什么为最终变量分配资源也为常规“convertView”分配资源?

任何帮助将不胜感激。

onClick()方法代码和final变量的初始化:

            final View finalConvertView = convertView;
        viewHolder.button.setonClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                finalConvertView.setBackgroundResource(R.drawable.item_shape);
            }
        });

如果需要,用于上下文的整个适配器类:

public class Personlistadapter extends ArrayAdapter<Person> {

private Context mContext;
private int mResource;

static class ViewHolder{
    TextView name;
    TextView age;
    TextView IQ;
    ImageView Gender;
    Button button;
}




public Personlistadapter(@NonNull Context context,int resource,@NonNull ArrayList<Person> objects) {
    super(context,resource,objects);
    mContext = context;
    mResource = resource;

}

@NonNull
@Override
public View getView(final int position,@Nullable View convertView,@NonNull ViewGroup parent) {
    String name = getItem(position).getName();
    int age = getItem(position).getAge();
    int iq = getItem(position).getIq();
    boolean IsAMan = getItem(position).getGender();

    final ViewHolder viewHolder;
    
    if(convertView == null) {

        LayoutInflater inflater = LayoutInflater.from(mContext);
        convertView = inflater.inflate(mResource,parent,false);
        viewHolder = new ViewHolder();
        viewHolder.name = (TextView) convertView.findViewById(R.id.name);
        viewHolder.IQ = (TextView) convertView.findViewById(R.id.IQ);
        viewHolder.age = (TextView) convertView.findViewById(R.id.age);
        viewHolder.Gender = (ImageView) convertView.findViewById(R.id.imageView);
        viewHolder.button = (Button) convertView.findViewById(R.id.button);

        final View finalConvertView = convertView;
        viewHolder.button.setonClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                finalConvertView.setBackgroundResource(R.drawable.item_shape);
            }
        });

        convertView.setTag(viewHolder);

    }
    else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.name.setText(name);
    viewHolder.age.setText(String.valueOf(age));
    viewHolder.IQ.setText(String.valueOf(iq));
    if(IsAMan){
        viewHolder.Gender.setimageResource(R.drawable.man);
        convertView.setBackgroundResource(R.drawable.item_shape_1);
    }
    else{
        viewHolder.Gender.setimageResource(R.drawable.woman);
        convertView.setBackgroundResource(R.drawable.item_shape);
    }



    return convertView;

}}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)