Frage

Ich habe eine benutzerdefinierte ListView erstellt, indem ich SimplyCursoradapter erweitert. Das Ergebnis ist Bild + checkedTextView (Text + Kontrollkästchen).

Nachdem ich Probleme mit den falschen Kontrollkästchen hatte, die überprüft wurden (siehe hier) Ich musste entfernen lv.setchoicemode (listView.choice_mode_multiple); von Oncreate.

Jetzt klicke ich auf eine ListItem -Zeile und überprüft das richtige Kontrollkästchen.

Ich versuche einen linearlayout zu erstellen. Sichtbar, wenn 1 oder mehr Kontrollkästchen überprüft werden, und linearlayout.Gone Wenn kein Kontrollkästchen aktiviert ist.

Hier ist der Code:

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);

} });

So binde ich die ListView an den benutzerdefinierten Adapter:

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));

Ich habe zwei Probleme damit:

  1. Wenn ich 2 oder mehr Kontrollkästchen überprüfe und dann nur eine deaktiviere, verschwindet der Linearlayout, was bedeutet SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions(); ist Null. Warum ist es null, wenn noch andere Kontrollkästchen überprüft werden?

  2. Wenn ich wechsle findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE); zu findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE); (Wie ich will) Das erste Kontrollkästchen wird korrekt überprüft und nach dem Linearlayout ist alles wieder ein Chaos, genau wie auf meine vorherige Frage.

Schätzen Sie jede Hilfe!

War es hilfreich?

Lösung

Warum erwarten Sie, dass GetCheckeditempositionen () Null zurückgeben, wenn es keine überprüften Artikel nicht überprüft hat? Es sieht so aus, als ob Ihr Auswahlmodus falsch ist

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.

Das Array sollte nur null sein, wenn es Choice_Mode_None ist.

Warum nicht so etwas probieren?

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;
}

Aktualisieren

Ich bin mir ziemlich sicher, dass es mit dieser Linie zu tun hat

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

Sie erhalten die Aussicht und geben dann die Sicht auf den Inflater über. Ich bin ein bisschen ratlos, wenn genau das Verhalten, das Sie ausüben, geben würde. Vielleicht möchten Sie auch die ausprobieren bindView() Methode, obwohl ich nicht sicher bin, warum. Anstatt das Standard -Android -Layout zu verwenden (das, das Sie dem SetAdapter geben, machen Sie Ihr eigenes Layout. Es wird eindeutig verwirrt, welche Ansicht welches Layout zugewiesen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top