Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 列表视图中的Android EditText-不稳定/意外结果_Java_Android_Android Listview_Android Arrayadapter - Fatal编程技术网

Java 列表视图中的Android EditText-不稳定/意外结果

Java 列表视图中的Android EditText-不稳定/意外结果,java,android,android-listview,android-arrayadapter,Java,Android,Android Listview,Android Arrayadapter,我已经在一个客户机/服务器应用程序上工作了几个月,现在是我本科学位的最后一年项目,我正在开发一个列表视图,它应该显示一个产品列表,并允许用户输入一个表示该产品库存量的值。我已经设法使视图和适配器看起来正确,但是EditText给我带来了问题,我花了几个小时在谷歌上搜索答案,搜索StackOverflow以查找类似的问题,但我发现的要么没有应用,要么没有解决问题 我几乎可以肯定这是一个回收问题,但问题的根源似乎是指我,输入EditText的值似乎被插入到hashmap中的几个位置,而不仅仅是一个位

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

我几乎可以肯定这是一个回收问题,但问题的根源似乎是指我,输入EditText的值似乎被插入到hashmap中的几个位置,而不仅仅是一个位置,滚动列表很快会导致大多数视图(如果不是所有视图)显示相同的值!这是我的适配器类的全部内容,我很乐意提供任何其他有帮助的代码,提前谢谢

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

我个人发现,如果我不重写适配器中的函数,就会出现各种奇怪的无法解释的问题。在您的情况下,我想我应该执行空检查,然后返回名为“data”的Stock[]数组的大小。我不能保证这将解决你的问题,但它总是“治愈”在这些情况下为我随机怪异。出于完整性考虑,您可能还需要重写。

由于您有一个自定义的getView(),请尝试扩展BaseAdapter而不是ArrayAdapter,这样对您的情况更简单。ArrayAdapter最适合于简单的事情,比如每一行都是一个文本视图…

这似乎是正确的,试着打印出stockHashMap中存储的值以仔细检查它是否脏。我添加了两个详细的日志语句(一个在
stockHashMap.get(id)
之后,另一个在
stockHashMap.put之后)(id,editable.toString());
打印出HashMap中设置和拉入的内容,一切看起来都很好;我注意到后者通常会将输入到一个EditText中的输入设置为HashMap中的两个或三个id!:SNo avail,恐怕没有用,下面是我添加到适配器中的内容:[剪:为了可读性,我把代码移到了问题的底部。]不确定我会如何做,它会给我带来什么好处,它是否为我带来了沉重的负担?有什么建议/额外的评论吗?
@Override
public int getCount()
{
    if (data == null) return 0;
    return data.length;
}

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