簡體   English   中英

不能在內部類中引用非最終變量

[英]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...
        }
    });

onTickonFinish使用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.

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