1

私はいくつかの TextViews、EditTexts、および買い物リストの項目を表すチェックボックスを備えたカスタム ListView を持っています。値 EditText に値を入力すると、チェックボックスをオンにすると、Toast にそれぞれの数量を掛けた値の合計が表示され、すべてのアイテムのすべてのチェックボックスをオンにすると、ダイアログに買い物リストの合計値が表示されます。私の問題は、値を入力した後に数値キーボードが非表示になると、チェックボックスのチェック状態が失われることです。何が問題なのですか?

これは私の getView メソッドのコードの一部です:

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

    final ViewHolder holder;

    SharedPreferences sharedPrefs = contexto.getSharedPreferences("sharedPrefs", Context.MODE_PRIVATE);

    if (convertView == null) {
        LayoutInflater inflater = contexto.getLayoutInflater();
        convertView = inflater.inflate(R.layout.items_layout, null);
        holder = new ViewHolder();
        holder.texto = (TextView) convertView.findViewById(R.id.txtDescricao);
        holder.checkbox = (CheckBox) convertView.findViewById(R.id.chkProduto);
        holder.edtValor = (EditText) convertView.findViewById(R.id.txtValor);
        holder.edtQtde = (EditText) convertView.findViewById(R.id.txtQuantidade);
        holder.btnMenos = (Button) convertView.findViewById(R.id.btnMenos);
        holder.btnMais = (Button) convertView.findViewById(R.id.btnMais);
        //holder.btnExcluir = (ImageButton) convertView.findViewById(R.id.btnExcluir);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    editor = sharedPrefs.edit();

    holder.posicao = position;
    holder.texto.setText(getItem(position).getTexto());     

    if(getItem(position).getValor() > 0)
        holder.edtValor.setText(Double.toString(getItem(position).getValor()));
    else
        holder.edtValor.setText("");

    holder.edtValor.setTag(new LinhaItemTag(getItem(position), position));  
    holder.edtValor.addTextChangedListener(new TextWatcherValor(holder));       

    if(quantidades[position] > 0)
        holder.edtQtde.setText(Integer.toString(quantidades[position]));
    else
        holder.edtQtde.setText("");

    holder.edtQtde.setTag(new LinhaItemTag(getItem(position), position));   
    holder.edtQtde.addTextChangedListener(new TextWatcherQuantidade(holder));

    holder.btnMenos.setTag(new LinhaItemTag(getItem(position), position));  
    holder.btnMais.setTag(new LinhaItemTag(getItem(position), position));
    //holder.btnExcluir.setTag(new LinhaItemTag(getItem(position), position));


    holder.checkbox.setOnCheckedChangeListener(null);
    //holder.checkbox.setChecked(getItem(position).Selecionado());
    getItem(position).setSelecionado(sharedPrefs.getBoolean("CheckValue"+position, false));
    holder.checkbox.setChecked(getItem(position).Selecionado());
    holder.checkbox.setTag(new LinhaItemTag(getItem(position), position));

    holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            LinhaItemTag elemento = (LinhaItemTag) buttonView.getTag();
            elemento.item.setSelecionado(isChecked);        
            editor.putBoolean("CheckValue"+position, isChecked);
            editor.commit();

            if (isChecked) {
                pegos[elemento.position] = true;                    
            } else {
                pegos[elemento.position] = false;               
            }

            String vlrTotal = calculaTotal();

            boolean checados = true;
            for (int i = 0; i < lista.size(); i++) {
                if (!pegos[i]) {
                    checados = false;
                    break;
                }
            }           
            if (checados) {             
                mostraDlgFinaliza();                                        
            }
            else if(getItem(elemento.position).Selecionado())
            {
                Toast.makeText(contexto, "R$ " + vlrTotal, Toast.LENGTH_LONG).show();
            }
        }
    });

//Other piece of code

return convertView;

}
4

1 に答える 1

2

Android CheckBox の setOnCheckChangedListener の代わりに setOnClickListener() を使用する

の代わりに、 を介してチェック済みの設定をsetOnCheckChangedListener()使用して決定する必要があります。setOnClickListener()holder.checkbox.isChecked()

holder.checkBox.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
        final boolean isChecked = holder.checkBox.isChecked();
        // Do something here.
    }
});

向き/キーボードの変更によるスクロールや画面の再描画など、さまざまな理由で個々のオブジェクトが常にリサイクルおよびリセットされるCheckBoxため、変更されたリスナーは無効です。それぞれがビューに出入りするときにさまざまな位置に表示されます。そのため、毎回チェック値を設定し、クリックに応答する必要があります。CheckBoxListView/GridViewCheckBoxgetView()

それ以外の場合、チェック済みの変更のみに応答するとcheckChanged、予期しないタイミングでコールバックCheckBoxが再利用され、スワップされるセルのチェック済み状態が同じチェック設定である場合、コールバックがまったく受信されないことがあります。

于 2013-04-13T18:57:39.277 に答える