将 '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:
https://android--code.blogspot.com/2015/12/android-recyclerview-add-remove-item.html
甚至引用:https://developer.android.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();
}
我的主要 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 的底部用新位置更新数据库中的所有数据。
我有一个具有 Drag/Drop 功能的 RecyclerView。 Drop/Drop 在自定义适配器中完成。使用 Room for Database 和 Entities 将不会以 "dropped" 顺序保存。
我试过十几种不同的 methods/githubs:
https://android--code.blogspot.com/2015/12/android-recyclerview-add-remove-item.html
甚至引用:https://developer.android.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();
}
我的主要 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 的底部用新位置更新数据库中的所有数据。