有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用Json保存和恢复RecyclerView项的位置

我有一个包含5个项目的RecyclerView和drag&;下降功能。我想将物品的位置保存到SharedReference中,以便在应用程序启动时恢复它们。目前,我可以使用Json将他们的位置保存到SharedReference中,但当我恢复位置时,应用程序崩溃。有解决办法吗?谢谢

    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


共 (1) 个答案

  1. # 1 楼答案

    问题在于你的JSON。 您可以看到,要序列化为JSON的对象是mSaveItemsOrder,它是一个ArrayList。但是在反序列化时,你给GSON类new TypeToken<Item>(){}.getType()。 所以你在JSON中存储了一个ArrayList,但试图对另一个类进行反序列化,这是行不通的
    这应该是有效的:

    mItems = new Gson().fromJson(SP.getString("items_order", null),  new TypeToken<ArrayList>(){}.getType(););