2015-08-05 1 views
0

Как я реализую держатель вида?Как реализовать держатель вида в действии

private class ViewHolder { 
     TextView code, txtv; 
     CheckBox name; 
     Button btnnn; 
    } 

    @Override 
    public View getView(final int position, View convertView, 
      ViewGroup parent) { 

     ViewHolder holder = null; 
     Log.v("ConvertView", String.valueOf(position)); 

     if (convertView == null) { 
      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(R.layout.abb_list, null); 

      holder = new ViewHolder(); 
      holder.code = (TextView) convertView.findViewById(R.id.code); 
      holder.name = (CheckBox) convertView 
        .findViewById(R.id.checkBox1); 
      holder.btnnn = (Button) convertView.findViewById(R.id.btn); 
      holder.txtv = (TextView) convertView.findViewById(R.id.txt); 
      convertView.setTag(holder); 

      holder.name.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
        CheckBox cb = (CheckBox) v; 
        checkTable country = (checkTable) cb.getTag(); 
        country.setSelected(cb.isChecked()); 
       } 
      }); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.btnnn.setOnClickListener(new OnClickListener() { 

      int counter = 0; 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       counter++; 

       holder.txtv.setText(String.valueOf(counter)); 
      } 
     }); 

     checkTable checkTable = itemsList.get(position); 
     holder.code.setText(" (" + checkTable.getitemprice() + ")"); 
     holder.name.setText(checkTable.getitemname()); 
     holder.name.setChecked(checkTable.isSelected()); 
     holder.name.setTag(checkTable); 


     return convertView; 

    } 

} 

, когда я делаю holder.txtv.setText(String.valueOf(counter)); так показать мне ошибку Cannot refer to the non-final local variable holder defined in an enclosing scope предложить мне, как я могу решить эту проблему.

+3

переменный держатель ** должен быть окончательным. ** Анонимный класс не может получить доступ к локальным переменным в своей охватывающей области, которые не объявлены окончательными или фактически окончательными. ** https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html – Raghunandan

+0

Название также немного вводит в заблуждение. Проблема не в основном в отношении шаблона держателя. Речь идет о том, как переменные используются в анонимном классе. – FlanschiFox

+0

Примите ответ, если все готово. Счастливое кодирование. :) – FlanschiFox

ответ

2

Вы можете использовать finalTextView для Слушателя:

final TextView counterTxt = holder.txtv; 
holder.btnnn.setOnClickListener(new OnClickListener() { 

    int counter = 0; 

    @Override 
    public void onClick(View v) { 
     counter++; 
     counterTxt.setText(String.valueOf(counter)); 
    } 
}); 
+0

спасибо, что он сделан для меня –

1

Объявите несколько переменных вне метода, как частные переменные:

private TextView counterTx; 
private int counter; 
private ViewHolder holder; 

EDIT: Я считаю, что это было бы лучше, реализация объявляя эти переменные как final, так как после этого вы не сможете изменить их значения.

0

Я рекомендую вам двигаться findViewById и View.OnClickListener в ViewHolder. Также храните в нем ссылку checkTable. Это сделает код более чистым.

Этот вид стиля изучен с RecylerView.ViewHolder. RecylerView имеет целью заменить ListView и должен использоваться в будущих проектах.

@Override 
public View getView(final int position, View convertView, 
     ViewGroup parent) { 

    ViewHolder holder = null; 
    Log.v("ConvertView", String.valueOf(position)); 

    if (convertView == null) { 
     LayoutInflater vi = LayoutInflater.from(parent.getContext()); 
     convertView = vi.inflate(R.layout.abb_list, parent, false); 
     holder = new ViewHolder(convertView); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    checkTable checkTable = itemsList.get(position); 
    holder.country = checkTable; 
    holder.code.setText(" (" + checkTable.getitemprice() + ")"); 
    holder.name.setText(checkTable.getitemname()); 
    holder.name.setChecked(checkTable.isSelected()); 

    return convertView; 
} 

// Try to use static inner class as possible as you can, this will eliminate 
// many strange issues. 
private static class ViewHolder implments View.OnClickListener { 
    checkTable country; 
    TextView code, txtv; 
    CheckBox name; 
    Button btnnn; 

    public ViewHolder(View view) { 
     view.setTag(this); 
     code = (TextView) convertView.findViewById(R.id.code); 
     name = (CheckBox) convertView.findViewById(R.id.checkBox1); 
     btnnn = (Button) convertView.findViewById(R.id.btn); 
     txtv = (TextView) convertView.findViewById(R.id.txt); 
     name.setOnClickListener(this); 
     btnnn.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (v == btnnn) { 
      // ViewHolder will be reused, you better move counter to checkTable 
      checkTable.counter++; 
      txtv.setText(String.valueOf(checkTable.counter)); 
     } else if (v == name) { 
      country.setSelected(name.isChecked()); 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^