2016-01-27 11 views
10

Ho un RecyclerView - Grid, con trascinamento & rilasciare, utilizzando questo code Sono riuscito a raggiungere questo obiettivo, e apportato molte modifiche, un solo problema, non riesco a salvare la posizione degli oggetti trascinati al riavvio (l'app non è il telefono). Quello che ho pensato è aggiungere "int position" al mio costruttore item.java, ma quello che non posso fare è ottenere la posizione modificata.Mantenere posizione Drag & Dropped posizione al riavvio

Sto utilizzando lo stesso codice di trascinamento & fornito nel collegamento.

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

Ecco il codice in onCreate:

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

Getting duplicato articoli dopo la posizione che cambiano, Codice:

@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 al post forse? – Jaeger

+0

Giusto per notare, le posizioni vengono aggiunte automaticamente, non impostate manualmente. – Jaeger

+0

Ho corretto correttamente, che si desidera mantenere lo stato di 'AllItems' tra le esecuzioni dell'app, giusto? –

risposta

7

Basta conservare la collezione modificata AllItems in SharedPreferences e caricarla nell'app inizio & memorizzarla di nuovo, una volta usciti dall'app.

Per fare ciò, è necessario serializzare la raccolta in JSON per Gson e memorizzarla come String. E poi deserializzare esso in seguito:

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

L'utilizzo di questi due metodi:

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

Appena incontrato un problema strano, quando cambio le posizioni, gli elementi verranno duplicati nel round successivo, Cosa c'è che non va? Ho usato "setOrderedItems" all'interno del metodo ItemTouchHelper. – Jaeger

+0

Ho modificato questo risultato (risultato == null)? nuovo ArrayList (): risultato solo per "risultato", E sto ricevendo NullpointerException, Quindi la mia ipotesi è, Restituisce null => creando un nuovo elenco, => salvandolo in preferenze condivise, => restarting => di nuovo è ottenendo null e creando un nuovo elenco, ecco perché è duplicato, ma perché restituisce null ogni volta? – Jaeger

+0

@AboHani puoi salvare la tua lista in 'onPause()' di 'Activity' /' Fragment' e ripristinare in 'onResume()'. Se non aiuta - inserisci il codice da qualche parte e proverò a capire :-) –

Problemi correlati