[英]Cannot refer to a non-final variable i inside an inner class defined in a different method
[英]Cannot refer to non-final variable inside an inner class
我試圖在ListView
每一行中有一個CountDownTimer
。 我可以為每行中的按鈕設置onClick
方法的唯一地方是CustomListAdapter
。 但是我不能參考應該顯示剩余時間的TextView
。 我收到此錯誤:
不能在不同方法中定義的內部類中引用非最終變量持有者
我曾嘗試將持有人設置為最終,但后來我收到此錯誤:
不能分配最終的局部變量持有者。 必須為空且不使用復合賦值
這是我的代碼:
public class CustomTimerRowAdapter extends ArrayAdapter < TimerRow > {
Context context;
int height;
public CustomTimerRowAdapter(Context context, int resourceId,
List < TimerRow > items) {
super(context, resourceId, items);
this.context = context;
// Height of screen from not Activity subclass
height = context.getResources().getDisplayMetrics().heightPixels;
}
/* private view holder class */
private class ViewHolder {
TextView txtTimer;
TextView txtName;
Button bStartStop;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
final TimerRow rowItem = getItem(position);
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.timer_row, null);
holder = new ViewHolder();
// make layout params
holder.txtTimer = (TextView) convertView.findViewById(R.id.tvTimes);
holder.txtTimer.getLayoutParams().height = height / 10;
holder.txtName = (TextView) convertView.findViewById(R.id.tvName);
holder.txtName.getLayoutParams().height = height / 10;
holder.bStartStop = (Button) convertView
.findViewById(R.id.bStartStopTimer);
holder.bStartStop.getLayoutParams().height = height / 10;
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
holder.txtName.setText(rowItem.getName());
holder.bStartStop.setOnClickListener(new OnClickListener() {
final ViewHolder temp = new ViewHolder();@
Override
public void onClick(View v) {
new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
// THIS IS WHERE I CANNOT REFER TO THE NON-FINAL VARIABLE
holder.txtTimer.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
holder.txtTimer.setText("done!");
}
}.start();
}
});
return convertView;
}
}
對於如何解決這個問題,有任何的建議嗎?
這應該有效:
final ViewHolder holder;
即最初不要將其分配給 null。
而不是讓holder
最終使用v.getParent()
來訪問按鈕上的 TextView,如下所示:
holder.bStartStop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
View parent = (View)v.getParent();
final TextView txtTimer = parent.findViewById(R.id.tvTimes);
//... your code here...
}
});
在onTick
和onFinish
使用txtTimer
來更新 TextView 文本。
將ViewHolder holder
聲明為類變量。 知道了? 不! 往下看。
您的 getView 將如下所示
private ViewHolder holder;
public View getView(int position, View convertView, ViewGroup parent) {
holder = null;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.