0

对于我本科学位的最后一年项目,我已经在客户端/服务器应用程序上工作了几个月,我目前正在开发一个 ListView,它应该显示产品列表并允许用户输入代表的值该商品的库存数量。我设法让 View 和 Adapter 看起来正确,但 EditText 给我带来了问题,我花了几个小时在谷歌上搜索答案并搜索 StackOverflow 寻找类似的问题,但我发现要么没有应用,要么没有解决问题。

我几乎可以肯定它是一个回收器问题,但问题的根源似乎暗示了我,输入到 EditText 中的值似乎被插入到我的哈希图中的几个位置,而不仅仅是一个,并且快速滚动列表会导致大多数 -如果不是所有视图都显示相同的值!这是我的适配器类的完整内容,我很乐意提供任何其他有帮助的代码,提前谢谢你。

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;
}
}

回复:马特 C 的回答:添加了以下内容,但没有更好。

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

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

2 回答 2

0

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

于 2013-03-27T00:06:54.100 回答
0

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

于 2013-03-27T00:08:59.820 回答