簡體   English   中英

從匿名內部類訪問非最終變量

[英]access non final variable from anonymous inner class

public class FoodTypeAdapter extends BaseAdapter {
private Context context;

public FoodTypeAdapter(Context context) {
    this.context = context;
}

public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder = null;
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.food_type_grid,
                new LinearLayout(context));
        holder = new ViewHolder();          
        holder.btnAdd = (Button) convertView.findViewById(R.id.btnItemAdd);
        holder.etQty = (EditText) convertView.findViewById(R.id.etfItemQty);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.btnAdd.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            String quantity = holder.etQty.getText().toString();
            System.out.println(quantity);
        }
    });
    return convertView;
}

public int getCount() {
    return mylist.size();
}

public Object getItem(int position) {
    return null;
}

public long getItemId(int position) {
    return 0;
}

static class ViewHolder {       
    Button btnAdd;
    EditText etQty;
}
}

在這個代碼不化妝holder作為final Object我不能訪問它OnClickListener

如果我做它作為final Object ,我不能啟動holderholder = new ViewHolder();

現在該怎么辦? 任何幫助將是非常可貴的。

謝謝,古娜

您還可以簡單地調整holder的初始化,從而減少代碼的復雜性:

final ViewHolder holder;

if (convertView == null) {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(R.layout.food_type_grid,
            new LinearLayout(context));
    holder = new ViewHolder();
    holder.btnAdd = (Button) convertView.findViewById(R.id.btnItemAdd);
    holder.etQty = (EditText) convertView.findViewById(R.id.etfItemQty);
    convertView.setTag(holder);
} else {
    holder = (ViewHolder) convertView.getTag();
}

您可以通過在匿名類之前添加一個臨時final變量來解決該問題,而改用該變量:

final ViewHolder finalHolder = holder;    // <- added

holder.btnAdd.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        String quantity = finalHolder.etQty.getText().toString();
        //                ^^^^^^^^^^^
        System.out.println(quantity);
    }
});

或者,您可以使holder為成員變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM