【问题标题】:How to Increase or decrease value of edittext in listview's each row?如何增加或减少列表视图每一行中edittext的值?
【发布时间】:2015-08-28 05:53:26
【问题描述】:

我创建了一个Listview,在我的Listview 中我有两个Buttons 和一个Edittext。在我的Edittext 中,我想根据Button 的点击增加Edittext 的值。我学习了很多教程,但在我的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;
 }
}

【问题讨论】:

  • 制作final UserHolder holder
  • 并且声明时不要赋值null,否则无法赋值对象

标签: android android-listview android-viewholder


【解决方案1】:

在这种情况下,您无法访问使用局部变量,当调用 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 );
    }
   }
  });

希望对你有帮助!

【讨论】:

  • 但是我有红线并显示无法引用封闭范围中定义的非最终局部变量持有者
  • 这一行附近 int mValue = Integer.parseInt(holder.textAddress.getText().toString());
  • mValue 没问题,它只是在本地定义的。持有人必须是最终的
  • UserHolder holder = null; 更改为final UserHolder holder;
  • 最终的 UserHolder holder = null;我是这样做的...现在它在 holder = new UserHolder(); 附近显示红线并说不能分配最终的局部变量持有者。它必须为空且不使用复合赋值
【解决方案2】:

编辑

尝试像这样声明持有者,不要尝试在后面的代码中重新声明它。

final UserHolder holder = new UserHolder();

最终变量不能重新赋值

【讨论】:

  • 最终 UserHolder 持有人 = null;我是这样做的...现在它在 holder = new UserHolder(); 附近显示红线并说不能分配最终的局部变量持有者。它必须为空白且不使用复合赋值
  • 应该是final UserHolder holder;
  • 当您使用final UserHolder holder = new UserHolder(); 时,您无法在else 部分中对持有人进行分配
  • @BenjaminScharbau 你是对的..这是最终的 UserHolder 持有者;...但最终的 UserHolder 持有者 = new UserHolder();努力工作
  • 当你给最终变量赋值时,你不能改变它。这就是为什么你应该只先声明最终变量,然后再添加值
【解决方案3】:

使用final UserHolder holder; 而不是UserHolder holder = new UserHolder()

【讨论】:

  • 你能告诉我是否想用 pageradapter 扩展类做同样的事情吗?
  • 对不起,我不太明白你想用 pagerAdapter 做什么
  • 在 pageradapter 中我想用两个按钮和 ediitext 添加相同的布局并希望执行相同的操作
猜你喜欢
  • 2019-02-05
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多