Tengo un ArrayAdapter para listView que tiene una casilla de verificación dentro. Cuando se cambia el valor de la casilla de verificación, quiero obtener la lista de elementos con casillas de verificación marcadas.

Dentro de la función onCreate para mi actividad

ArrayAdapter<DrawerDetail> adapter = new ArrayAdapter<DrawerDetail>(this, R.layout.settings_minidrawer_item, apps) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView == null){
            convertView = getLayoutInflater().inflate(R.layout.settings_minidrawer_item, null);
        }
        ImageView appIcon = (ImageView)convertView.findViewById(R.id.item_app_icon);
        appIcon.setImageDrawable(apps.get(position).icon);
        appIcon.setTag(apps.get(position).name);
        TextView appLabel = (TextView)convertView.findViewById(R.id.item_app_name);
        appLabel.setText(apps.get(position).label);
        appLabel.setText(Integer.toString(position));
        CheckBox appCheck = (CheckBox)convertView.findViewById(R.id.item_app_check);
        appCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
                UpdatePreferences();
            }
        });

        return convertView;
    }
};

list.setAdapter(adapter);

updatePreferences

public void UpdatePreferences() {
    SharedPreferences.Editor prefEditor = prefs.edit();

    SparseBooleanArray checked = list.getCheckedItemPositions();

    List<String> drawerListArray = new ArrayList<String>();
    View v;
    CheckBox c;
    for(int i = 0; i < list.getAdapter().getCount(); i++) {
        v = list.getAdapter().getView(i, null, list);
        c = (CheckBox) v.findViewById(R.id.item_app_check);
        TextView aka = (TextView) v.findViewById(R.id.item_app_name);
        aka.setText("dd");
        Log.e("checked: ", Boolean.toString(c.isChecked()));
    }
}

Si marca el valor SparsBooleanArray checked, siempre es nulo. Además, list.getAdapter().getView() no parece funcionar.

Estas líneas no pueden encontrar ninguna vista (no devuelven error, pero no pueden obtener / establecer valor):

c = (CheckBox) v.findViewById(R.id.item_app_check);
TextView aka = (TextView) v.findViewById(R.id.item_app_name);

He probado diferentes enfoques pero no pude hacerlo funcionar. Ahora supongo que estoy anulando el método getView para el adaptador y entran en conflicto entre sí, pero no pude encontrar ninguna solución sobre cómo anular getView de una manera que funcione para ambos.

0
CBeTJlu4ok 13 dic. 2016 a las 17:08

2 respuestas

La mejor respuesta

No recupere estas vistas. Pase información marcada / no marcada en su onCheckedChangeListener, por ejemplo Cadena e información si está marcada / desmarcada. Luego, puede recopilar elementos marcados en una matriz.

Intenta hacer algo así:

public class TestClass {

    private List<String> checkedStrings = new ArrayList<>();

    ...

    void updateArray(boolean checked, String checkedText){
        if(checked){
            if(!checkedStrings.contains(checkedText)){
                checkedStrings.add(checkedText);
            }
        } else {
            checkedStrings.remove(checkedText);
        }
    }
}

Y en su ArrayAdapter:

appCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
                updateArray(isChecked, apps.get(position).label);
            }
        });
1
Tomasz Czura 13 dic. 2016 a las 14:42

Intente reemplazar su código:

c = (CheckBox) v.findViewById(R.id.item_app_check);

Con este código:

View nextChild = null;

// Find CheckBox inside the parent view
for (int i = 0; i < ((ViewGroup) v).getChildCount(); ++i) {
    nextChild = ((ViewGroup) v).getChildAt(i);
    if (nextChild instanceof CheckBox) {
        // Do your work;

        break;
    }
}
1
AndroWeed 13 dic. 2016 a las 14:42