2016-07-04 1 views
0

У меня есть RecyclerView с 5 элементами и перетащить &. Я хочу сохранить позиции позиций в SharedPreferences, чтобы восстановить их при запуске приложения. В настоящее время я могу сохранить свои позиции в SharedPreferences с помощью Json, но приложение падает, когда я восстанавливаю позиции. Любое решение? Благодарю.Как сохранить и восстановить позиции позиций RecyclerView с помощью Json

public static AppCompatActivity mActivity; 
    public static SharedPreferences SP; 
    public static SharedPreferences.Editor mEditor; 
    public static RecyclerView mRecyclerView; 
    public static RecyclerViewDragDropManager mRecyclerViewDragDropManager; 
    public static List<Long> mSaveItemsOrder; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     mActivity = this; 

     SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
     mEditor = SP.edit(); 

     mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     mRecyclerViewDragDropManager = new RecyclerViewDragDropManager(); 
     mRecyclerViewDragDropManager.setInitiateOnMove(false); 
     mRecyclerViewDragDropManager.setInitiateOnLongPress(true); 
     mRecyclerViewDragDropManager.setLongPressTimeout(300); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     mRecyclerView.setAdapter(mRecyclerViewDragDropManager.createWrappedAdapter(new Adapter())); 
     mRecyclerViewDragDropManager.attachRecyclerView(mRecyclerView); 
    } 

    public static class Item { 
     public final long id; 
     public final String text; 

     public Item(long id, String text) { 
      this.id = id; 
      this.text = text; 
     } 
    } 

    public static class ViewHolder extends AbstractDraggableItemViewHolder { 

     Button mButton; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      mButton = (Button) itemView.findViewById(R.id.button); 
     } 

    } 

    public static class Adapter extends RecyclerView.Adapter<ViewHolder> implements DraggableItemAdapter<ViewHolder> { 

     List<Item> mItems; 

     public Adapter() { 
      setHasStableIds(true); 

      mItems = new ArrayList<>(); 
      if (SP.getString("items_order", null) == null) { 
       for (int mInt = 0; mInt < 5; mInt++) { 
        mItems.add(new Item(mInt, "Item " + mInt)); 
       } 
      } else { 
       mItems = new Gson().fromJson(SP.getString("items_order", null), new TypeToken<Item>(){}.getType()); 
      } 

     } 

     @Override 
     public long getItemId(int position) { 
      return mItems.get(position).id; 
     } 

     @Override 
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_view, parent, false); 
      return new ViewHolder(mView); 
     } 

     @Override 
     public void onBindViewHolder(final ViewHolder holder, final int position) { 
      Item mItem = mItems.get(position); 
      holder.mButton.setText(mItem.text); 
     } 

     @Override 
     public int getItemCount() { 
      return mItems.size(); 
     } 

     @Override 
     public void onMoveItem(int fromPosition, int toPosition) { 
      Item mMovedItem = mItems.remove(fromPosition); 
      mItems.add(toPosition, mMovedItem); 
      notifyItemMoved(fromPosition, toPosition); 
     } 

     @Override 
     public boolean onCheckCanStartDrag(ViewHolder holder, int position, int x, int y) { 
      return true; 
     } 

     @Override 
     public ItemDraggableRange onGetItemDraggableRange(ViewHolder holder, int position) { 
      return null; 
     } 

     @Override 
     public boolean onCheckCanDrop(int draggingPosition, int dropPosition) { 
      return true; 
     } 

    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     mSaveItemsOrder = new ArrayList<>(); 
     for (int mInt = 0; mInt < mRecyclerView.getAdapter().getItemCount(); mInt++) { 
      mSaveItemsOrder.add(mRecyclerView.getAdapter().getItemId(mInt)); 
     } 

     mEditor.putString("items_order", new Gson().toJson(mSaveItemsOrder)).commit(); 
    } 

Это ошибка: https://www.dropbox.com/s/j2tf4n08depyynt/Error.txt?dl=0

+0

Опубликовать StackTrace авиакатастрофы. – Thommy

+0

Done .. Проверить первое сообщение –

ответ

0

RecyclerView В сек адаптер должен всегда иметь обновленные элементы как с точки зрения порядка и с точки зрения данных. Это означает, что вы сначала переупорядочиваете элементы в своем адаптере, а затем вызываете RecyclerView.notifyItemMoved().

И onSaveInstanceState вашей деятельности или фрагмента

ArrayList<ParcelableModel> items = adapter.getItems(); 
//or serialise them as a json and store as a string 

bundle.putParcelableArrayList("items_key", items); 

И onRestoreInstanceState вы получить их обратно

ArrayList<ParcelableModel> items = bundle.getParcelableArrayList("items_key"); 
0

Проблема с вашим JSON. Вы объект, который вы сериализуете для JSON, это mSaveItemsOrder, который является ArrayList. Но при десериализации вы даете GSON класс new TypeToken<Item>(){}.getType(). Итак, вы храните ArrayList в своем JSON, но пытаетесь десериализировать другой класс, который не сработает.
Это должно работать:

mItems = new Gson().fromJson(SP.getString("items_order", null), new TypeToken<ArrayList>(){}.getType();); 
Смежные вопросы