Как увеличить или уменьшить значение edittext в каждой строке списка?

Я создаю один Listview, в моем Listview у меня два Buttons и один Edittext. В моем Edittext я хочу увеличить значение Edittext по клику Button. Я следовал стольким учебным пособиям, но все равно это не работает в моем Listview, может ли кто-нибудь помочь мне с этим?

Я следую этому руководству: http://www.androidhub4you.com/2013/02/muftitouch-listview-multi-click.html

Он показывает: Cannot refer to the non-final local variable holder defined in an enclosing scope


Код:

public class UserCustomAdapter extends ArrayAdapter<User> {
 Context context;
 int layoutResourceId;
 ArrayList<User> data = new ArrayList<User>();

 public UserCustomAdapter(Context context, int layoutResourceId,
   ArrayList<User> data) {
  super(context, layoutResourceId, data);
  this.layoutResourceId = layoutResourceId;
  this.context = context;
  this.data = data;
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  View row = convertView;
  UserHolder holder = null;

  if (row == null) {
   LayoutInflater inflater = ((Activity) context).getLayoutInflater();
   row = inflater.inflate(layoutResourceId, parent, false);
   holder = new UserHolder();
   holder.textName = (TextView) row.findViewById(R.id.textView1);
   holder.textAddress = (EditText) row.findViewById(R.id.textView2);
   holder.textLocation = (TextView) row.findViewById(R.id.textView3);
   holder.btnEdit = (Button) row.findViewById(R.id.button1);
   holder.btnDelete = (Button) row.findViewById(R.id.button2);
   row.setTag(holder);
  } else {
   holder = (UserHolder) row.getTag();
  }
  User user = data.get(position);
  holder.textName.setText(user.getName());
  //holder.textAddress.setText(user.getAddress());
  holder.textLocation.setText(user.getLocation());
  holder.btnEdit.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Log.i("Edit Button Clicked", "**********");
   /* Toast.makeText(context, "Edit button Clicked",
      Toast.LENGTH_LONG).show();*/

    int mValue = Integer.parseInt(holder.textAddress.getText().toString());
    mValue--;
    if(mValue < 0)
    {
        System.out.println("not valid");
    }
    else
    {
        holder.textAddress.setText( ""+mValue );
    }
   }
  });
  holder.btnDelete.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Log.i("Delete Button Clicked", "**********");
   /* Toast.makeText(context, "Delete button Clicked",
      Toast.LENGTH_LONG).show();*/
   }
  });
  return row;

 }

 static class UserHolder {
  TextView textName;
  EditText textAddress;
  TextView textLocation;
  Button btnEdit;
  Button btnDelete;
 }
}

person Aditya    schedule 28.08.2015    source источник
comment
сделать final UserHolder holder   -  person Rustam    schedule 28.08.2015
comment
И не присваивайте null во время объявления, иначе вы не сможете присвоить объект   -  person Benjamin Scharbau    schedule 28.08.2015


Ответы (3)


В этом случае вы не можете получить доступ к локальным переменным. К тому времени, когда вызывается onClickListener, переменные выйдут за рамки.

Поэтому вместо этого вы можете также установить ViewHolder в качестве тега для кнопки, после чего вы сможете получить к нему доступ в своем onClick.

holder.btnEdit.setTag(holder);
holder.btnEdit.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
     ViewHolder tagHolder = (ViewHolder) v.getTag();

    // TODO Auto-generated method stub
    Log.i("Edit Button Clicked", "**********");
   /* Toast.makeText(context, "Edit button Clicked",
      Toast.LENGTH_LONG).show();*/

    int mValue = Integer.parseInt(tagHolder.textAddress.getText().toString());
    mValue--;
    if(mValue < 0)
    {
        System.out.println("not valid");
    }
    else
    {
        tagHolder.textAddress.setText( ""+mValue );
    }
   }
  });

Я надеюсь, что это помогает!

person Rajesh    schedule 28.08.2015
comment
но правильно у меня есть красная линия и показывает, что нельзя ссылаться на неконечный держатель локальной переменной, определенный в охватывающей области - person Aditya; 28.08.2015
comment
рядом с этой строкой int mValue = Integer.parseInt(holder.textAddress.getText().toString()); - person Aditya; 28.08.2015
comment
mValue в порядке, он определяется только локально. держатель должен быть окончательным - person Benjamin Scharbau; 28.08.2015
comment
Изменить UserHolder holder = null; на final UserHolder holder; - person Benjamin Scharbau; 28.08.2015
comment
последний держатель UserHolder = null; я сделал так... теперь рядом с держателем отображается красная линия = new UserHolder(); и говорит, что последний держатель локальной переменной не может быть назначен. Оно должно быть пустым и не использовать составное присвоение. - person Aditya; 28.08.2015
comment
попробуйте объявить mValue глобально - person Rajesh; 28.08.2015
comment
я сделал ..до сих пор с держателем - person Aditya; 28.08.2015
comment
я снова обновил свой ответ. попробуйте еще раз отредактировать ответ - person Rajesh; 28.08.2015
comment
int mValue = Integer.parseInt(tagHolder.textAddress.getText().toString()); Эта линия еще нуждается в коррекции. Исправил. Следует использовать tagHolder вместо держателя. - person Kunal Singh; 16.10.2015

Изменить

Попробуйте объявить держатель таким образом и не пытайтесь повторно объявлять его позже в коде.

final UserHolder holder = new UserHolder();

Окончательные переменные не могут быть переназначены

person Oskari Mantere    schedule 28.08.2015
comment
последний держатель UserHolder = null; я сделал так... теперь рядом с держателем отображается красная линия = new UserHolder(); и говорит, что последний держатель локальной переменной не может быть назначен. Оно должно быть пустым и не использовать составное присвоение. - person Aditya; 28.08.2015
comment
Должно быть final UserHolder holder; - person Benjamin Scharbau; 28.08.2015
comment
Когда вы используете final UserHolder holder = new UserHolder();, вы не можете назначить держателя в части else - person Benjamin Scharbau; 28.08.2015
comment
@BenjaminScharbau, вы правы ... этот работает с последним держателем UserHolder; ... но последний держатель UserHolder = new UserHolder(); не работай - person Aditya; 28.08.2015
comment
Когда вы присваиваете значение переменной final, вы не можете его изменить. Вот почему вы должны сначала объявить конечную переменную, а затем добавить значение. - person Benjamin Scharbau; 28.08.2015

Используйте final UserHolder holder; вместо UserHolder holder = new UserHolder().

person Benjamin Scharbau    schedule 28.08.2015
comment
можете ли вы сказать, хочу ли я сделать то же самое с классом расширения pageradapter? - person Aditya; 28.08.2015
comment
Извините, я не совсем понимаю, что вы хотите делать с pagerAdapter - person Benjamin Scharbau; 28.08.2015
comment
в pageradapter я хочу добавить тот же макет с двумя кнопками и ediitext и хочу выполнить ту же операцию - person Aditya; 28.08.2015