2016-01-27 9 views
10

Ich habe ein RecyclerView - Grid, mit Drag & Drop, mit diesem code Ich habe es geschafft, zu erreichen, und machte eine Menge Änderungen, nur ein Problem, ich kann nicht speichern die Position der gezogenen Objekte beim Neustart (die App nicht das Telefon). Was ich dachte, ist das Hinzufügen von "int-Position" zu meinem item.java-Konstruktor, aber was ich nicht tun kann, ist die veränderte Position zu bekommen.Halten Sie Drag & Drop-Positionen beim Neustart

Ich benutze die gleichen Drag & Drop-Codes in den Link zur Verfügung gestellt.

ItemTouchHelper.Callback _ithCallback = new ItemTouchHelper.Callback() { 
    //and in your imlpementaion of 
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
     // get the viewHolder's and target's positions in your adapter data, swap them 
     Collections.swap(AllItems, viewHolder.getAdapterPosition(), target.getAdapterPosition()); 
     // and notify the adapter that its dataset has changed 

     rcAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition()); 
     return true; 
    } 

    @Override 
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 
     //TODO 
    } 

    //defines the enabled move directions in each state (idle, swiping, dragging). 
    @Override 
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
     return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, 
       ItemTouchHelper.DOWN | ItemTouchHelper.UP | ItemTouchHelper.START | ItemTouchHelper.END); 
    } 
}; 

Hier ist der Code in onCreate:

ItemTouchHelper ith = new ItemTouchHelper(_ithCallback); 
    ith.attachToRecyclerView(RcView); 

Elemente nach Position duplizierte Schritte zu ändern, Code:

@Override 
public void onStop() 
{ 
    super.onStop(); 
    SharedPreferencesTools.setOrderedItems(this, AllItems); 
} 

getAllItemList:

private List<Item> getAllItemList(){ 
AllItems = SharedPreferencesTools.getOrderedItems(this); 
//Add item .. etc 
//return items 

}

+0

A Bumb auf die Post vielleicht? – Jaeger

+0

Nur zu beachten, die Positionen werden automatisch hinzugefügt, nicht manuell eingestellt. – Jaeger

+0

Habe ich richtig verstanden, dass Sie den "AllItems" -Zustand zwischen den Läufen der App beibehalten wollen, richtig? –

Antwort

7

Bewahren Sie einfach Ihre geänderte Sammlung AllItems in SharedPreferences und laden Sie es auf der App Start & speichern Sie es zurück, sobald Sie aus der App heraus.

Um dies zu tun, müssen Sie Ihre Sammlung zu json durch Gson serialisieren und als String speichern. Und deserialisieren es dann danach:

public final class SharedPreferencesTools { 
    private static final String USER_SETTINGS_PREFERENCES_NAME = "UserSettings"; 
    private static final String ALL_ITEMS_LIST = "AllItemsList"; 
    private static Gson gson = new GsonBuilder().create(); 

    public static List<Item> getOrderedItems(Context context) { 
     String stringValue = getUserSettings(context).getString(ALL_ITEMS_LIST, ""); 
     Type collectionType = new TypeToken<List<Item>>() { 
     }.getType(); 
     List<Item> result = gson.fromJson(stringValue, collectionType); 
     return (result == null) ? new ArrayList<Item>() : result; 
    } 

    public static void setOrderedItems(Context context, List<Item> items) { 
     String stringValue = gson.toJson(items); 

     SharedPreferences sharedPreferences = getUserSettings(context); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(ALL_ITEMS_LIST, stringValue); 
     editor.apply();   
    } 

    static SharedPreferences getUserSettings(Context context) { 
     return context.getSharedPreferences(USER_SETTINGS_PREFERENCES_NAME, Context.MODE_PRIVATE); 
    } 
} 

Die Verwendung dieser beiden Methoden:

SharedPreferencesTools.setOrderedItems(getActivity(), AllItems); 
... 
List<Item> AllItems = SharedPreferencesTools.getOrderedItems(getActivity()); 
+0

Ich bin gerade in ein seltsames Problem geraten. Wenn ich die Positionen ändere, werden die Gegenstände in der nächsten Runde dupliziert. Was ist los? Ich habe die "setOrderedItems" in ItemTouchHelper-Methode verwendet. – Jaeger

+0

Ich habe diese Rückgabe geändert (result == null)? new ArrayList (): Ergebnis zu "result" nur, und ich bekomme NullpointerException, So meine Vermutung ist, Es gibt null => eine neue Liste, => Speichern in gemeinsamen Einstellungen, => Neustart => wieder ist es NULL zu erhalten und eine neue Liste zu erstellen, deshalb ist es doppelt vorhanden. Aber warum gibt es jedes Mal null zurück? – Jaeger

+0

@AboHani können Sie Ihre Liste in 'onPause()' von 'Activity' /' Fragment' speichern und in 'onResume()' wiederherstellen. Wenn es nicht hilft - poste den Code irgendwo und ich versuche es herauszufinden :-) –

Verwandte Themen