2016-05-27 3 views
0

Ich habe SearchView in meinem RecyclerView, Benutzer kann die Objekte dieser RecyclerView löschen, aber wenn Benutzer nach etwas sucht und ein Objekt aus den Ergebnissen löscht dies ist, wo ich habe ein Problem, wenn die Suche ist nicht aktiv bin eine DefaultArrayList von Objects, aber wenn die searchBar aktiv ist meine Ergebnisse Objekte werden in einer anderen ArrayList mit dem Namen FilteredArrayList und wenn ich ein Element aus Array-Liste löschen das Objekt wird gelöscht aus der FilteredArrayList und DataBase, aber nicht aus der DefaultArrayList Wenn also die Suche endet, bleibt die gleiche gelöschte Datei immer noch bei der DefaultArrayListBenachrichtigen dataSource Adapter wenn Objekt nicht mehr existiert

so eine Idee wie kann ich die DefaultArrayList benachrichtigen, dass das Objekt nicht mehr existiert (das ist immer noch im Cache DefaultArrayList) ???

gut habe ich versucht, dieses:

myAdapterClass.notifyDataSetChanged(); 

aber es tut den Job nicht

+0

Sie müssen es löschen von 'DefaultArrayList' durch den Aufruf' DefaultArrayList.remove (Index) 'und dann, wenn Sie benachrichtigen Der Adapter mit 'myAdapterClass.notifyDataSetChanged()' sollte funktionieren. – TychoTheTaco

+0

@TychoTheTaco aber Bro der Punkt ist dies kann ich nicht, weil gerade DeafultArray ist nicht die Aufnahme jetzt View verwendet FilteredArray und der Index von FilterArray wird anders sein als Deafultarray Index –

+0

Dann erhalten Sie nur einen Verweis auf 'DefaultArrayList' und Holen Sie dann das Objekt von 'FilterredArrayList' und rufen Sie' DefaultArrayList.remove (object) 'auf – TychoTheTaco

Antwort

1

myAdapterClass.notifyDataSetChanged(); hier nicht das Problem ist. Sie müssen das Element von FilteredArrayList und DefaultArrayList löschen. Eine andere Lösung für Ihr Problem ist die Verwendung nur einer ArrayList. und innerhalb Ihrer Adapter implementieren Sie die Filterable Schnittstelle. Weitere Informationen finden Sie unter Filterable example.

1

Wie wäre es, DefaultArrayList als Datenquelle an FilteredArrayList statt Kopieren + Filtern übergeben? In Pseudo-Code:

View { 

    defaultList: DefaultArrayList; 

    showSearchBar() { 
     filteredList = new FilteredArrayList(this.defaultList); 
     ... 
     this.searchBar.show(filteredList); 
    } 

} 


FilteredArrayList { 

    FilteredArrayList(dataSource) { 
    this.dataSource = dataSource; 
    } 

    enumerator() { 
     ... 
     // filtered items enumeration from dataSource 
     ... 
    } 

    delete(item) { 
     this.dataSource.delete(item); 
     // also delete from filtered cache if needed 
    } 

} 

Auch kann es mit delegates oder observers umgesetzt werden:

ListActionsDelegate { 

    onDelete(Item item); 

} 

View ... implements ListActionsDelegate { 

    defaultList: DefaultArrayList; 

    onDelete(Item item) { 
     this.defaultList.delete(item); 
    } 

    showSearchBar() { 
     filteredList = new FilteredArrayList(this.defaultList); 
     filteredList.delegate = this; 
     ... 
     this.searchBar.show(filteredList); 
    } 
} 

FilteredArrayList { 

    delegate: ListActionsDelegate; 

    FilteredArrayList(items) { 
    this.raw = items; 
    } 

    delete(item) { 
     super.delete(item); 

     if (this.delegate) 
     this.delegate.onDelete(item); // notify list actions delegate 
    } 

}