2013-07-18 13 views
7

Ich möchte Elemente in meiner Listenansicht ein-/ausblenden. Momentan mache ich das, indem ich die Adapterdaten durchspiele. Wenn Einzelteil in bestimmten Index eine Bedingung übereinstimmt, wird diese Zeile genannt:Elemente in Listview richtig ausblenden

listView.getChildAt(index).setVisibility(View.GONE); 

Artikel nicht sichtbar ist, aber leeren Raum bleibt (überraschend View.GONE und View.INVISIBLE wirkt das gleiche in diesem Fall). Ich möchte den gleichen Effekt erzielen, als ob Artikel aus Adapter gelöscht wurde und notifyDataSetChanged() aufgerufen wurde, aber ich möchte die zugrunde liegenden Daten nicht ändern, nur das Element ausblenden.

+1

Filtern Sie die Daten zuerst im Adapter und fügen Sie sie nie zur Listenansicht hinzu. Es ist so einfach. – Tugrul

+0

mögliches Duplikat von [Android: Wie man ein ListView-Objekt versteckt] (http://stackoverflow.com/questions/2638160/android-how-to-hide-a-listview-item) – Sufian

Antwort

5

Ich habe dies erreicht, wie Tonithy schlägt here vor. Am Anfang der Methode "getView" im Adapter wurde eine if-Klausel hinzugefügt, die überprüft, ob das Element die Bedingung zum Ausblenden erfüllt. Wenn es getView gibt, gibt "Null-Layout" zurück.

Wenn ich ein Objekt ausblenden möchte, stelle ich eine Bedingung und Aufruf .invalidateViews() auf meiner Listview.

+0

Die schlechteste Praxis, die ich je gesehen habe. – kravemir

0

Geben Sie keine unterschiedlichen Ansichten basierend auf der internen Eigenschaft zurück, ohne listview darüber zu informieren. Sie sollten Ansichten wiederverwenden! Sonst machst du sehr langsame Apps. Betrachten Sie beispielsweise this tutorial with benchmark.

  • getView(...) - Wiederverwendung convertView, verstecken es conditionaly!
  • Verwendung Holder Klassen, machen sie „hören“, um Ihre Adapter Signale/Evens und deren visuelle bedingt

Alternative ändern:

    : Sie mehrere Arten von Listenelementen innerhalb der einzelnen Liste verwenden können
  • (shown, hidden) Arten Listenelement definieren, außer Kraft setzen getViewTypeCount(): return 2
  • Überschreibung getItemViewType(...),
    • is shown -> 0
    • is not shown -> 1
  • komplexer getView(...)
    • get Artikel Ansicht oder überprüfen, ob sie auf Typ
    • Versand Ansicht Schöpfung basiert gezeigt ist, nicht vergessen, dass convertView Argument Ansicht ist, Für den aktuellen Elementtyp sollten Sie wiederverwenden, wenn nicht null!
  • auf Änderung Anruf notifyDataSetChanged()

ich so getestet haben für verschiedene stabile Typen angesprochen, aber es sollte auch Änderungen bei der Art für Punkt arbeiten, und Sie Beobachter darüber wissen lassen. Dieser Ansatz wird viel schneller sein als einer, den Sie gepostet haben, weil Sie Ansichten wiederverwenden, müssen Sie nicht immer neue aufblasen!

0

Rufen Sie .setVisibility (View.GONE) in override getView-Methode Ihres CustomeListAdapter für alle UI-Elemente Ihrer custom_list_item auf.

Beispiel:

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    Holder holder = new Holder(); 
    View rowView; 

    rowView = inflater.inflate(R.layout.custom_list_item, null); 

    holder.tvName = (TextView) rowView.findViewById(R.id.textViewName); 
    holder.img = (ImageView) rowView.findViewById(R.id.imageView1); 

    if (items[position].NeedForCollapsed){ 
     System.out.println("set Visibility.Gone"); 
     holder.tvName.setVisibility(View.GONE); 
     holder.img.setVisibility(View.GONE); 

     return rowView; 
    } 

    //new values 
    holder.tvName.setText(items[position].name); 
    holder.img.setImageResource(GetImageID(items[position])); 

    return rowView; 
} 

public class Holder 
{ 
    TextView tvName; 
    ImageView img; 
} 

Oder rufen Sie .setVisibility (View.GONE) für den Stamm-Container wie ein Linearlayout. viel Glück!