1

我有一个自定义 ListView,其中包含一些 TextView、EditText 和一个代表购物清单项目的复选框。当我在值Edittext中键入值时,我会检查复选框,敬酒向我显示了值乘以其各自数量的总和,当所有项目的所有复选框都被检查时,对话框向我显示了购物列表的总价值。我的问题是,当我输入值后隐藏数字键盘时,复选框失去了选中状态。可能是什么问题呢?

这是我的 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 CheckBoxes 使用 setOnClickListener() 而不是 setOnCheckChangedListener

而不是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侦听器无效,因为由于方向/键盘更改导致滚动或屏幕重绘CheckBox等各种原因,各个对象不断被回收和重置。ListView/GridView每个人都CheckBox可以在进出视野时出现在不同的位置。这就是为什么您必须每次都设置检查值getView()并且必须响应点击。

否则,如果您只响应检查的更改,您将checkChanged在意外时间收到回调,因为它们CheckBox被回收,有时如果正在交换的单元格中的检查状态具有相同的检查设置,您将根本不会收到回调。

于 2013-04-13T18:57:39.277 回答