Pregunta

He creado una lista de lista personalizada extendiendo SimpleCursorAdapter. El resultado es Image + CheckEdTextView (Texto + casilla de verificación).

Después de que tuve problemas con las casillas de verificación incorrectas siendo revisadas (mira aquí) Tenía que quitarme lv.setchoiceMode (listView.Choice_Mode_Multiple); de OnCreate.

Ahora hago clic en una línea ListItem y verifica la casilla de verificación correcta.

Lo que estoy tratando de hacer es hacer un LinearLayout. Visible cuando se marcan 1 o más casillas de verificación y hacer LinearLayout.

Aquí está el código:

lv.setOnItemClickListener(new OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

CheckedTextView markedItem = (CheckedTextView) view.findViewById(R.id.btitle);

if (!markedItem.isChecked()) {
 markedItem.setChecked(true);

 //show bottom control panel
 findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.VISIBLE);


} else {
 markedItem.setChecked(false);

 SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions();

 //if no checkbox is checked, hide bottom control panel
 if (lala == null) {
  findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);
 }
}
view.refreshDrawableState();
//showSortBtn(markedItem);

} });

Así es como encuentro el ListView al adaptador personalizado:

projection = new String[] { Browser.BookmarkColumns._ID,
                Browser.BookmarkColumns.FAVICON, Browser.BookmarkColumns.TITLE,
                Browser.BookmarkColumns.URL };
        displayFields = new String[] { Browser.BookmarkColumns.TITLE,
                Browser.BookmarkColumns.FAVICON, Browser.BookmarkColumns.URL };
        int[] displayViews = new int[] { android.R.id.icon, android.R.id.text1 };

        cur = managedQuery(BOOKMARKS_URI, projection,
                Browser.BookmarkColumns.BOOKMARK + " == 1", null, Browser.BookmarkColumns.VISITS + " DESC");

        setListAdapter(new ImageCursorAdapter(this,
                android.R.layout.simple_list_item_single_choice, cur,
                displayFields, displayViews));

Tengo dos problemas con esto:

  1. Si verifico 2 o más casillas de verificación y luego desamosa solo una, el LinearLayout desaparece, lo que significa SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions(); es nulo. ¿Por qué es nulo si todavía hay otras casillas de verificación verificadas?

  2. Si cambio findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE); a findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE); (Como quiero hacer) La primera casilla de verificación se verifica correctamente y después de que LinearLayout se haya ido, todo es un desastre nuevamente, al igual que en Mi pregunta anterior.

¡Aprecia cualquier ayuda!

¿Fue útil?

Solución

¿Por qué espera que GetCheckeditEmPositions () devuelva NULL si no hay elementos marcados? Parece que su modo de elección está mal

A SparseBooleanArray which will return true for each call to get(int position) where position is a position in the list, or null if the choice mode is set to CHOICE_MODE_NONE.

La matriz solo debe ser nula si es Choice_Mode_None.

¿Por qué no probar algo como esto?

if (((ListView) parent).getCheckedItemPositions().size() > 0){

    findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.VISIBLE);
else{

    findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE;
}

Actualizar

Estoy bastante seguro de que tiene que ver con esta línea

 View v = inView;
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.image_list, null);
        }

Obtiene la vista, luego reasigna la vista al inflator. Sin embargo, estoy perdiendo exactamente por qué le daría el comportamiento que está exeriando. Es posible que también desee probar el bindView() Método Aunque no estoy seguro de por qué. Tal vez en lugar de usar el diseño de Android predeterminado (el que está dando al SetAdapter, haga su propio diseño. Claramente se confunde en cuanto a qué vista se asigna a qué diseño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top