将 'n' 拖放到 Android 中的 RecyclerView 后保存所做的更改 - 我已阅读所有内容

Saving changes made after Drag 'n' Drop in RecyclerView in Android - I've read everything

我有一个具有 Drag/Drop 功能的 RecyclerView。 Drop/Drop 在自定义适配器中完成。使用 Room for Database 和 Entities 将不会以 "dropped" 顺序保存。

我试过十几种不同的 methods/githubs:

...清单还在继续...

我从许多不同的来源拼凑了代码:

我的自定义适配器:

public class SwipeAdapt extends OmegaRecyclerView.Adapter<SwipeAdapt.ViewHolder> {

    public void onItemDismiss(int position) {
        accountList.remove(position);
        notifyItemRemoved(position);
    }
    public boolean onItemMove(int fromPosition, int toPosition) {
        if (fromPosition < toPosition) {
            for (int i = fromPosition; i < toPosition; i++) {
                Collections.swap(accountList, i, i + 1);
            }
        } else {
            for (int i = fromPosition; i > toPosition; i--) {
                Collections.swap(accountList, i, i - 1);
            }
        }

        notifyItemMoved(fromPosition, toPosition);

        return true;
    }

    public void onItemClear() {
        for (int count = 0; count < accountList.size(); count++) {
            Account u = accountList.get(count);
            u.setId(count);
            upAccount(u);
        }
        notifyDataSetChanged();
    }

我的主要 Activity (Java):

    OmegaRecyclerView RVMain;
    Account crossOver;

    private ItemTouchHelper itemTouchHelper;


        RVMain = (OmegaRecyclerView) findViewById(R.id.theRV);
        RVMain.setLayoutManager(new LinearLayoutManager(this));
        getAccounts();
    }

    private void getAccounts() {
        class GetAccounts extends AsyncTask<Void,Void,List<Account>> {

            @Override
            protected List<Account> doInBackground(Void... voids) {
                List<Account> aList = DataClient.getInstance(getApplicationContext()).getAppDB().theDao().getAll();
                return aList;
            }

            @Override
            protected void onPostExecute(List<Account> accounts) {
                super.onPostExecute(accounts);
                SwipeAdapt adapter = new SwipeAdapt(MainActivity.this, accounts);
                RVMain.setAdapter(adapter);
                DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(RVMain.getContext(), new LinearLayoutManager(getApplicationContext()).getOrientation());
                RVMain.addItemDecoration(dividerItemDecoration);
                ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(adapter);
                itemTouchHelper = new ItemTouchHelper(callback);
                itemTouchHelper.attachToRecyclerView(RVMain);
            }
        }

        GetAccounts ga = new GetAccounts();
        ga.execute();
    }
}

回调 Drag/Drop

public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {
    private final SwipeAdapt mAdapter;

    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        //int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
        return makeMovementFlags(dragFlags, 0);
    }

    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
            if (viewHolder instanceof ItemTouchHelperViewHolder) {
                ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
                itemViewHolder.onItemSelected();
            }
        }

        super.onSelectedChanged(viewHolder, actionState);
    }
    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);
            mAdapter.onItemClear();
    }
}

希望这不是太多。如果有人愿意,我可以把所有内容都放在 GitHub 上。我没有收到任何错误。一切看起来都很好。根据所有这些消息来源,我做的是正确的。我正在“通知”一切,诸如此类。然而,每次 activity 更改时,RecyclerView 顺序都会恢复到 Drag/Drop 之前的状态。任何帮助是极大的赞赏。 TIA!

在方法 onItemMove 的底部用新位置更新数据库中的所有数据。