【问题标题】:While scrolling ListView randomly sets EditText value滚动 ListView 时随机设置 EditText 值
【发布时间】:2015-10-08 13:55:38
【问题描述】:

我有一个包含编辑文本的列表视图。我想在 listview 中为 edittext 中的每一行设置数量。但滚动后,edittext 的值会随机更改。 请帮帮我,任何答案都会得到认可。 提前致谢。

我已经参考了List view edittext data loses on scrolling in Android

这是我的适配器类:

import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MyArrayAdapter extends ArrayAdapter<String> implements QuantityView.OnQuantityChangeListener
{
 List<String> objects;
 Context context;
 ViewHolder viewHolder = null;
 public MyArrayAdapter(Context context, int resource,List<String> objects) 
 {
  super(context, resource, objects);
  this.context=context;
  this.objects=objects;
 }
 static class ViewHolder
 {
  TextView txt;
  QuantityView quantityViewDefault; 
  EditText editText;
  TextWatcher qtyWatcher;
  int ref;
 }
 @Override
 public View getView(int position, View convertView, ViewGroup parent) 
 {

       try { 
              final ViewHolder holder;
              // TODO Auto-generated method stub 
              if (convertView == null) {
               holder = new ViewHolder();

          LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          convertView = inflater.inflate(R.layout.row, null);

          holder.txt = (TextView) convertView.findViewById(R.id.txt);
          holder.editText = (EditText) convertView.findViewById(R.id.edittxt);

          convertView.setTag(holder);
          } else { 
              holder = (ViewHolder) convertView.getTag();
          } 
          holder.ref = position;
          if (holder.qtyWatcher != null) 
          {
              holder.editText.removeTextChangedListener(holder.qtyWatcher);
          } 

          holder.txt.setText(objects.get(position));
          holder.editText.setHint("Quantity");

          holder.qtyWatcher = new TextWatcher() 
          {
              @Override 
              public void beforeTextChanged(CharSequence s, int start,
                      int count, int after) 
              {
              } 

              @Override 
              public void onTextChanged(CharSequence s, int start,
                      int before, int count) {
              } 

              @Override 
              public void afterTextChanged(Editable s) {
                  //Update the quantity 
              } 
          }; 
          holder.editText.addTextChangedListener(holder.qtyWatcher);


          return convertView;
      } catch (NumberFormatException ex) 
      {
          Toast.makeText(context, "!!!", Toast.LENGTH_SHORT).show();
          ex.printStackTrace();
      } 
      return convertView;
 }
 @Override
 public void onQuantityChanged(int newQuantity, boolean programmatically) 
 {
  Toast.makeText(context, "Quantity: " + newQuantity, Toast.LENGTH_LONG).show();
 }
 @Override
 public void onLimitReached() 
 {
  Log.d(getClass().getSimpleName(), "Limit reached");
 }
}

【问题讨论】:

  • 你可以在这里发布你的适配器类吗?

标签: android android-listview


【解决方案1】:

在您的getView(int position, View convertView, ViewGroup parent) 方法中,您只需通过设置新的TextWatcher 和提示来更新EditText

不使用 TextWatcher 更新的数量更新文本值会导致重复使用 EditText 之前的值。从而更改数据上下文中的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多