4

私のリストビューで本当に奇妙なことが起こっています。ボタンと editText を使用して ListView を作成しています。

[Button] [EditText] [Button]、ボタンは「インクリメンタ」と「デクリメンタ」のように機能し、クリックごとに EditText の数値を 1 単位で更新します。問題は、ボタンをクリックすると、ほとんどの場合、別のリスト ビュー要素の editText が変更される (クリックされた項目の editText も変更される) ことです。この誤って変更された項目のボタンをクリックすると、最初の項目の editText も変更されます。ボタンと editText の参照は基本的に同じですが、データを含む textView があり、このデータはそれらの間で異なります。

それを達成するために、私が作成したカスタムアダプター:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if(convertView == null) {
            convertView = mInflater.inflate(R.layout.lastproduct_row, null);
            holder = new ViewHolder();
            holder.btnAddQtd = (Button) convertView.findViewById(R.lastproduct_row.btn_add_qtd);
            holder.btnSubQtd = (Button) convertView.findViewById(R.lastproduct_row.btn_sub_qtd);
            holder.etQuantidade = (EditText) convertView.findViewById(R.lastproduct_row.et_quantidade);                

            TextView tv;

            holder.tvList = new TextView[PRODUCTROW_INT_KEY.length];

            for(int i = 0; i < PRODUCTROW_INT_KEY.length; i++) {
                tv = (TextView) convertView.findViewById(PRODUCTROW_INT_KEY[i]);
                holder.tvList[i] = tv;                  
            }

            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        HashMap<String, String> hm = productsList.get(position);
        String key = hm.get(CODIGO_KEY);

        for(int i = 0; i < PRODUCTROW_INT_KEY.length; i++) {
            holder.tvList[i].setText(hm.get(PRODUCTROW_STR_KEY[i]));
        }

        holder.btnAddQtd.setTag(key+QTD_FLAG+ADD_ACTION);
        holder.btnSubQtd.setTag(key+QTD_FLAG+SUB_ACTION);
        holder.btnAddQtd.setOnClickListener(handle);
        holder.btnSubQtd.setOnClickListener(handle);

        if(novosEstoques.containsKey(key)) {
            holder.etQuantidade.setText(MyParseFunctions.parseCentesimal(novosEstoques.get(key).getQuantidade()));
        }

        return convertView;
    }

    class ViewHolder {
        private TextView []tvList;
        private Button btnAddQtd, btnSubQtd;
        private Button btnAddQtVol, btnSubQtVol;
        private EditText etQuantidade, etQtVolume;
    }

ボタンに onClick リスナーを追加し、それらのタグに listView 要素 ID (別の情報と連結) を設定しました。次に、イベント リスナーで、ボタンの親ビュー (LinearLayout) を取得し、getViewAt() を使用して、そこから EditText を取得します。

    @Override
    public void onClick(View v) {
        String tag = (String) v.getTag();

        if(tag.contains(QTD_FLAG)) {
            String []info = ((String) v.getTag()).split(QTD_FLAG);
            float qtd;
            LinearLayout ll = (LinearLayout) v.getParent();
            ll.setBackgroundColor(Color.rgb(0, 128, 30));
            EditText et = (EditText) ll.getChildAt(2);

            qtd = Float.parseFloat(et.getText().toString().replace(",", "."));

            if(info[1].equals(ADD_ACTION)) {
                qtd++;

            }
            else if(info[1].equals(SUB_ACTION)) {
                if(qtd > 0)
                    qtd--;
            }

            Log.d("TESTE", "MODIFICAR KEY = "+info[0]);
            et.setText(qtd+"");
        }           
    }

この例では setBackgroundColor を使用して、LinearLayout インスタンスが lisView で複製されていることを確認しています。ボタンをクリックすると、2 つの異なるリスト ビュー アイテムに描画されます。

誰でも私にこれをしている可能性があることを指摘できますか? ListViewアイテムが重複している人を見つけました。それが私の場合かどうかはわかりません.ListView内にTextViewがあり、それらは等しくありません。ボタンとeditTextを含むLinearLayout部分のみが「共有」されています。


getView メソッドにいくつかの変更を加えましたが、現在は機能しています! getView メソッドが呼び出されるたびに、editTexts が適切に入力されることをまったく保証していないようで、それを認識していませんでした。したがって、getView を呼び出すたびに editText 値を設定します。ユーザーが ET 値を編集した場合は、それを HashMap に格納して getView に復元します。指定された editText のエントリが HashMap にない場合は、デフォルトに設定します。値 (ゼロ):

    ...
    if(convertView == null) {
            holder = new ViewHolder();
            holder.btnAddQtd = (Button) convertView.findViewById(R.lastproduct_row.btn_add_qtd);
            holder.btnSubQtd = (Button) convertView.findViewById(R.lastproduct_row.btn_sub_qtd);
            holder.etQuantidade = (EditText) convertView.findViewById(R.lastproduct_row.et_quantidade); 

            //Now it is easier to get etQuantidade reference in button
            //click handle, I just have to do:
            //    public onClick(View v) {
            //        EditText etButtonAssociated = (EditText) v.getTag();
            //        ...
            //    }
            holder.btnAddQtd.setTag(holder.etQuantidade);
            holder.btnSubQtd.setTag(holder.etQuantidade);

            holder.btnAddQtd.setOnClickListener(handle);
            holder.btnSubQtd.setOnClickListener(handle);
            ...
    }
    else {
        ...
    }
    holder.etQuantidade.setTag(key);

    if(novosEstoques.containsKey(key)) {
        holder.etQuantidade.setText(MyParseFunctions.parseCentesimal(novosEstoques.get(key).getQuantidade()));
    }
    else {
        holder.etQuantidade.setText("0");
    }

    return convertView;
4

1 に答える 1

0

イスラエル、

あなたのコードを見た後、私はあなたが下した実装の決定について疑問に思いました。各ボタンは特定のボタンに「バインド」されているので、それらのボタンを?にEditText設定することを検討しましたか?UI要素を含む任意のものにすることができます。これは、ランタイム入力リストなどの動的UI要素に特に役立ちます。TagButtonsEditTextTagObject

これはあなたの中で処理されるので、Adapterあなたは重複した親などについて心配する必要はありません。さらに、コントロールを持っているので、コントロールを「見つける」ことを心配する必要がなくなりますonClick()(これはタグです)。プロジェクトに必要なものが正確にはわかりませんが、Buttons他のタスクを実行するために必要な場合を除いて、これは潜在的に実行可能なソリューションのようです。

注意事項完了したら 、タグの参照を必ず消去してくださいEditText。そうしないと、メモリがリークするリスクがあります。

FuzzicalLogic

于 2011-10-15T19:19:59.007 に答える