1

Hallo Ich habe ein Problem bekommen alle Elemente von meinem Adapter in meinem Fragment. Genauer gesagt verwende ich einen ScaleInAnimatorAdapter zusammen mit meinem Kundenadapter, und wenn ich versuche, meine Checkbox-Elemente aus dem unten angegebenen Code zu bekommen, sehe ich innerhalb meines Fragments scheinbar nur die sichtbaren Elemente auf dem Bildschirm.Erhalten Sie alle Elemente von Adapter (Recyclerview) in Fragment

private View.OnClickListener onAllClick = new View.OnClickListener() { 
    @Override public void onClick(View v) { 
     int count = listAdapter.getItemCount(); 

     for (int i = 0; i < count; i++) { 
      View mChild = listTopics.getChildAt(i); 

      if(mChild != null) { 
       Log.d(TAG,"getItemCount(): " + i); 

       CheckBox cBox = (CheckBox)mChild.findViewById(R.id.topic_chk); 
       cBox.setChecked(((CheckBox) v).isChecked()); 
       Log.d(TAG,"isChecked" + cBox.getTag()); 
       cBox.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         if(((CheckBox) v).isChecked()) { 
          checkboxAll.setChecked(false); 
         } 
        } 
       }); 
      } 
     } 
    } 
}; 

Im Grunde bin ich versucht, einen Scheck alle Features aus dem Fragment zu erzeugen, so dass, wenn diese alle der Kontrollkästchen Elemente aus dem Adapter geprüft geklickt wird. Ich habe das zum Arbeiten mit dem Code, den ich vorgestellt habe, aber das Hauptproblem ist, dass ich nur die Elemente auf dem Bildschirm sichtbar bekomme. Wenn ich also zu meinen anderen Elementen scrolle, werden sie nicht überprüft. Also frage ich mich, ob es einen besseren Weg oder einen anderen Weg für mich gibt, alle Artikel zu bekommen

Antwort

1

Adapter sind dazu gedacht, zugrunde liegende Datenspeicher an Ansichten zu binden; Sie sollten im Allgemeinen nicht verwendet werden, um Daten selbst zu speichern (außer dass sie eine Kopie der Daten für Bindungszwecke haben), noch sollten sie Aktionen an Daten ausführen.

Stattdessen sollten Sie die zugrunde liegenden Daten ändern und dann den Adapter über den von Ihnen verwendeten Mechanismus aktualisieren. (Loader, benutzerdefinierte Setter mit notifyDataItemChanged, etc.).

+0

Ok, ich sehe jetzt. Ich habe dieses Konzept aus irgendeinem Grund missverstanden. Also wenn ich dich richtig verstanden habe, sollte ich stattdessen zB in meinem Model einen setChecked, isChecked und toggleChecked haben, um die Daten zu aktualisieren und in meinem Adapter einige andere Methoden haben, die die Ansicht der entsprechenden Checkboxen basierend auf diesen Daten aktualisieren. – hect1c

1

Grundsätzlich können Sie nicht. Es wird wieder UI-Ansichten sein. Sie benötigen eine Flagge in allen Datenliste Objekte zu setzen, rufen notifyDataSetChanged() und onBindViewHolder Kontrolle, die Flagge und es verwenden, deaktivieren Sie überprüfen

if(listAdapter.getItem(position).getIsChecked()) 
    viewHolder.checkBox.setChecked(true); 
else 
    viewHolder.checkBox.setChecked(false); 
+0

Hey, danke für die Antwort. Also habe ich ein Flag in meinem View Holder initialisiert, welches auf dem onBindViewHolder gesetzt ist. Also jetzt in meinem Fragment sollte ich prüfen, ob die Flagge auf jedem Element, dann aktualisieren Sie die Flagge, setzen Sie das Kontrollkästchen auf der Ansicht und rufen Sie notifyDataSetChanged, so dass meine Recyclerview Daten aktualisiert werden. Sagt ihr das? Entschuldigung, wenn der fehlende Code in diesem Kommentar nicht hilft – hect1c

+0

Ja. Allerdings habe ich diesen Teil nicht verstanden "setze das Kontrollkästchen auf die Ansicht" .. Ruhe scheint in Ordnung zu sein. – Uday

+0

So wie es visuell gesetzt, also setze das Kontrollkästchen auf die Ansicht, ich wollte nur deaktivieren und überprüfen. Ihr Viewholder-Objekt initialisiert das View-Objekt und initialisiert es dann mit dem endgültigen TopicsListViewHolder holder = (TopicsListViewHolder) v.getTag(); oder gibt es einen besseren Weg? – hect1c

0

Du es falsch zu tun. Sie sollten den Adapter aktualisieren, anstatt die Kontrollkästchenansicht zu aktualisieren.

Was Sie tun können, können Sie ein Feld in Adapter Data Holder erstellen.

Und wenn Sie die Auswahl ändern, aktualisieren Sie einfach das Feld oder das Mehrfachfeld und schließlich aktualisieren Sie die Ansicht.

0

Ok. Danke euch allen für die, die geantwortet haben, dass ihr mir geholfen habt, etwas wirklich Grundlegendes und Wichtiges zu erfassen, das mich ansprach.

Ich habe es zu arbeiten, so dass für jeden, der diesen Beitrag lesen können, hier ist meine Lösung:

  • notwendigen Methoden erstellen und Feld Ihre Daten in einem Modell zu aktualisieren (dh privaten is_checked, set_checked (), is_checked(), usw.)
  • in Ihrem Adapter onBindViewHolder, werden Sie Ihre Halter Checkbox setzen so etwas wie an den Daten zugeordnet werden, so:

    holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
        @Override 
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
         obj.setSelected(buttonView.isChecked()); 
        } 
    }); 
    holder.checkBox.setChecked(obj.isSelected()); 
    
  • Dann in Ihrem Fragment oder Aktivität ich habe nur ein klicken Hörer auf meinem Haupt-Kontrollkästchen, und dann, wenn ich überprüft Schleife durch die Liste meiner Daten und mit Hilfe des Modells Methode, die ich meine Daten aktualisieren und einfach nur listAdapter.notifyDataSetChanged verwenden()