java保存在Android中拖放RecyclerView后所做的更改我已经阅读了所有内容
我有一个具有拖放功能的RecyclerView。拖放在自定义适配器中完成。将空间用于数据库,实体将不会以“删除”顺序保存
我尝试了十几种不同的方法/方法:
https://安卓--code.blogspot.com/2015/12/安卓-recyclerview-add-remove-item.html
偶数引用:https://developer.安卓.com/guide/topics/ui/drag-drop.html
。。。而且这个名单还在继续
我从一堆不同的来源拼凑了代码:
我的自定义适配器:
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();
}
我的主要活动(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();
}
}
拖放回调
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上。我没有发现任何错误。一切看起来都很好。根据所有这些消息来源,我做得对。我“通知”了一切,诸如此类。然而,每次活动发生变化时,RecyclerView顺序都会恢复到拖放之前的状态。非常感谢您的帮助。蒂亚
# 1 楼答案
在方法ONIMMOVE的底部,用新位置更新数据库中的所有数据