Java 保存拖动后所做的更改';n';Android-I';我什么都读了
我有一个具有拖放功能的RecyclerView。拖放在自定义适配器中完成。将空间用于数据库,实体将不会以“删除”顺序保存 我尝试了十几种不同的方法/方法:Java 保存拖动后所做的更改';n';Android-I';我什么都读了,java,android,android-recyclerview,drag-and-drop,android-room,Java,Android,Android Recyclerview,Drag And Drop,Android Room,我有一个具有拖放功能的RecyclerView。拖放在自定义适配器中完成。将空间用于数据库,实体将不会以“删除”顺序保存 我尝试了十几种不同的方法/方法: 甚至提到: …而且名单还在继续 我从一堆不同的来源拼凑了代码: 我的自定义适配器: public class SwipeAdapt extends OmegaRecyclerView.Adapter<SwipeAdapt.ViewHolder> { public void onItemDismiss(in
- 甚至提到:
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();
}
希望这不会太多。如果有人愿意,我可以把整个东西放到GitHub上。我没有发现任何错误。一切看起来都很好。根据所有这些消息来源,我做得对。我“通知”了一切,诸如此类。然而,每次活动发生变化时,RecyclerView顺序都会恢复到拖放之前的状态。非常感谢您的帮助。蒂亚 在方法ONIMMOVE的底部,使用新位置更新数据库中的所有数据。在方法ONIMMOVE的底部,使用新位置更新数据库中的所有数据。如果您希望在关闭应用程序或移动到其他活动后保留项目的顺序,您需要向实体文件添加一个属性,该属性将作为订单值提供给服务器。添加后,您可以访问dao并在对项目重新排序后在方法onItemMove中运行更新SQL,然后在每次加载列表时,返回按该属性排序的项目。我想您没有代码来备份您的断言吗?如果您希望在关闭应用程序或移动到其他活动后保留项目的顺序,您需要向实体文件添加一个属性,该属性将作为订单值提供给服务器。添加后,您可以访问dao并在对项进行重新排序后在方法onItemMove中运行更新SQL,然后在每次加载列表时返回按该属性排序的项。我想您没有代码来备份您的断言吗?
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();
}
}
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();
}
}