0

私は数か月間、学部の最終年度のプロジェクトのためにクライアント/サーバー アプリケーションに取り組んできました。現在、製品のリストを表示し、ユーザーが値を入力できるようにする ListView に取り組んでいます。その商品の在庫数。ビューとアダプターを正しく表示することができましたが、EditText が問題を引き起こしています。答えを探すために何時間も費やし、同様の問題について StackOverflow を精査しましたが、見つかったものは適用されていないか、解決されていません問題。

リサイクラーの問題であるとほぼ確信していますが、問題の根本は私をほのめかしているようです.EditTextに入力された値は、ハッシュマップの1つだけでなく、いくつかの位置に挿入されているようです.リストをすばやくスクロールすると、ほとんどの-すべてのビューで同じ値が表示されるわけではありません。これが私の 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];
}
4

2 に答える 2

0

カスタム getView() を持っているので、ArrayAdapter の代わりに BaseAdapter を拡張してみてください。あなたの場合ははるかに簡単です。ArrayAdapter は、各行が TextView であるような単純なものに最適です...

于 2013-03-27T00:08:59.820 に答える
0

私は個人的に、アダプターでgetCount関数をオーバーライドしないと、説明のつかない奇妙な問題が発生することを発見しました。あなたの場合、null チェックを行ってから、「data」という名前の Stock[] 配列のサイズを返すと思います。これで問題が解決することを保証することはできませんが、これらの場合、私にとっては常にランダムな奇妙さを「治す」ことができます. 完全を期すためにgetItemをオーバーライドすることもできます。

于 2013-03-27T00:06:54.100 に答える