【问题标题】:Maintain Drag & Dropped items position when restarting重新启动时保持拖放项目位置
【发布时间】:2016-05-04 09:53:12
【问题描述】:

我有一个 RecyclerView - Grid,带有拖放功能,使用这个code 我已经设法实现了这一点,并且做了很多更改,只有一个问题,我无法在重新启动时保存拖动的项目位置(应用程序不是手机)。 我想的是在我的 item.java 构造函数中添加“int position”,但我不能做的是得到改变的位置。

我正在使用链接中提供的相同拖放代码。

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

这是 onCreate 中的代码:

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

位置改变后获取重复项,代码:

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

getAllItemList:

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

}

【问题讨论】:

  • 可能是一个笨蛋?
  • 请注意,位置是自动添加的,不是手动设置的。
  • 我是否理解正确,您希望在应用程序运行之间保持AllItems 状态,对吗?
  • 我有7个项目,每个添加的项目都根据它添加的位置获得一个位置,就像位置0的WiF,位置1的蓝牙,用户将长按并修改位置,现在..用户将杀死应用程序,当他回来时,位置将被重置并返回默认值,我想要的是保持更改的位置。
  • 好的,我明白了。然后在下面查看我的答案:-)

标签: android drag-and-drop android-recyclerview


【解决方案1】:

只需将修改后的集合 AllItems 保存在 SharedPreferences 中,然后在应用启动时将其加载并在退出应用后将其存储回来。

为此,您需要通过Gson 将您的集合序列化为json 并存储为String。然后反序列化它:

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

这两种方法的用法:

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

【讨论】:

  • 刚刚遇到一个奇怪的问题,当我改变位置时,下一轮的物品会重复,怎么了?我在 ItemTouchHelper 方法中使用了“setOrderedItems”。
  • 我改变了这个返回值(结果 == null)? new ArrayList() :结果仅“结果”,我得到 NullpointerException,所以我的猜测是,它返回 null => 创建一个新列表,=> 将其保存到共享首选项,=> 重新启动 =>再次它变得空,并创建一个新列表,这就是它被重复的原因,但是为什么它每次都返回空?
  • @AboHani 您可以将您的列表保存在Activity/FragmentonPause() 中并在onResume() 中恢复。如果它没有帮助 - 将代码发布到某处,我会尝试弄清楚:-)
  • 这是一项服务,为什么? SmallApp API 使用一个服务来运行一个小应用程序(来自索尼),在 onCreate/onStop 中也是一样的,更新了。
猜你喜欢
  • 2013-09-17
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多