Как перезаписать в базе 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);
}

}


Ответы (0 шт):