ListView中的Android EditText - 不稳定/意外结果

时间:2013-03-27 00:01:36

标签: java android android-listview android-arrayadapter

我已经为我的本科学位课程的最后一年项目工作了几个月的客户端/服务器应用程序,我正在研究ListView,它应该显示产品列表并允许用户输入表示库存中该项目数量的值。我已经设法让View和Adapter看起来正确,但是EditText导致了我的问题,我花了几个小时搜索答案并搜索StackOverflow以解决类似的问题但是我发现要么没有应用或者没有解决这个问题。

我几乎肯定它是一个回收者问题,但问题的根源似乎暗示我,输入EditText的值似乎被插入到我的hashmap中的几个位置,而不仅仅是一个,并快速滚动列表导致大部分(如果不是全部)视图显示相同的值!这是我的Adapter类,我很乐意提供任何其他有用的代码,谢谢你。

public class StockAdapter extends ArrayAdapter<Stock> {

private LayoutInflater mLayoutInflater;
Context context;
int layoutResourceId;
Stock data[] = null;
Map<Integer, String> stockHashMap = new HashMap<Integer, String>(); 

public StockAdapter(Context context, int layoutResourceId, Stock[] data)
{
    super(context, layoutResourceId, data);
    mLayoutInflater = LayoutInflater.from(context);
    this.context = context;
    this.layoutResourceId = layoutResourceId;
    this.data = data;
}

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

    if (convertView == null)
    {
        convertView = mLayoutInflater.inflate(layoutResourceId, null);

        // Instantiate StockHolder object.
        holder = new StockHolder();
        // Get views
        holder.txtName = (TextView) convertView.findViewById(R.id.stockName);
        holder.etValue = (EditText) convertView.findViewById(R.id.etValue);
        convertView.setTag(holder);
    }
    else
    {
        holder = (StockHolder)convertView.getTag();
    }
    // Get stock object from data set.
    Stock stock = data[position]; 

    holder.txtName.setText(stock.Name);

    // Put stock id in a variable - used for referencing the right stock item.
    final int id = stock.Id;
    String oldText = stockHashMap.get(id);
    // Check if the value of oldText is null.
    holder.etValue.setText(oldText == null ? "" : oldText);

    // Create addTextChangedListener for this EditText
    holder.etValue.addTextChangedListener(
            new TextWatcher(){
                public void afterTextChanged(Editable editable) {
                    stockHashMap.put(id, editable.toString());
                }
                public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) {
                    // TODO Auto-generated method stub

                }

                public void onTextChanged(CharSequence s, int start, int before,
                        int count) {
                    // TODO Auto-generated method stub
                }
            });
    return convertView;
}
static class StockHolder
{
    int id;
    TextView txtName;
    EditText etValue;
}
}

RE:Matt C的回答:添加了以下内容,但没有更好。

@Override
public int getCount()
{
    if (data == null) return 0;
    return data.length;
}

@Override
public Stock getItem(int position)
{
    return data[position];
}

2 个答案:

答案 0 :(得分:0)

我个人已经发现,如果我不覆盖适配器中的getCount函数,我会遇到各种奇怪的无法解释的问题。在你的情况下,我想我会做一个空检查,然后返回名为“data”的Stock []数组的大小。我不能保证这会解决你的问题,但在这些情况下,对我来说总是“治愈”随机怪异。为了完整起见,您可能还想覆盖getItem

答案 1 :(得分:0)

由于你有一个自定义的getView()尝试扩展BaseAdapter而不是ArrayAdapter,它对你的情况来说要简单得多。 ArrayAdapter最适合简单的事情,比如每一行都是TextView ......