Как перезаписать в базе SQLite измененные позиции RecyclerView при перетаскивании (сортировке)?
Имеется RecyclerView, в котором реализована сортировка элементов при помощи перетаскивания и она прекрасно работает. Данные извлекаются из базы SQLite. Как сохранить новые позиции при перетаскивании в базу данных? Спасибо.
public class AdapterSmetaFull extends RecyclerView.Adapter<AdapterSmetaFull.ViewHolder> implements RecyclerRowMoveCallback.RecyclerViewRowTouchHelperContract{
private final List<PersonSmetaPunkt> mPeopleList;
private final Context mContext;
public AdapterSmetaFull(List<PersonSmetaPunkt> myDataset, Context context) {
mPeopleList = myDataset;
mContext = context;
}
@NonNull
@Override
public AdapterSmetaFull.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
LayoutInflater inflater = LayoutInflater.from(
parent.getContext());
View v =
inflater.inflate(R.layout.smeta_list_full, parent, false);
return new ViewHolder(v);
}
...
@Override
public int getItemCount() {
return mPeopleList.size();
}
@Override
public void onRowMoved(int from, int to) {
if(from < to)
{
for(int i=from; i<to; i++)
{
Collections.swap(mPeopleList,i,i+1);
}
}
else
{
for(int i=from; i>to; i--)
{
Collections.swap(mPeopleList,i,i-1);
}
}
notifyItemMoved(from,to);
}
...
RecyclerRowMoveCallback.java
public class RecyclerRowMoveCallback extends ItemTouchHelper.Callback {
private RecyclerViewRowTouchHelperContract touchHelperContract;
public RecyclerRowMoveCallback(RecyclerViewRowTouchHelperContract touchHelperContract){
this.touchHelperContract = touchHelperContract;
}
@Override
public boolean isLongPressDragEnabled() {
return true;
}
@Override
public boolean isItemViewSwipeEnabled() {
return false;
}
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
int dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
return makeMovementFlags(dragFlag,0);
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
this.touchHelperContract.onRowMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());
return false;
}
@Override
public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
if(actionState != ItemTouchHelper.ACTION_STATE_IDLE)
{
if(viewHolder instanceof AdapterSmetaFull.ViewHolder){
AdapterSmetaFull.ViewHolder myViewHolder = (AdapterSmetaFull.ViewHolder)viewHolder;
touchHelperContract.onRowSelected(myViewHolder);
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
if(viewHolder instanceof AdapterSmetaFull.ViewHolder){
AdapterSmetaFull.ViewHolder myViewHolder = (AdapterSmetaFull.ViewHolder)viewHolder;
touchHelperContract.onRowClear(myViewHolder);
}
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
public interface RecyclerViewRowTouchHelperContract{
void onRowMoved(int from,int to);
void onRowSelected(AdapterSmetaFull.ViewHolder myViewHolder);
void onRowClear(AdapterSmetaFull.ViewHolder myViewHolder);
}
}