У меня есть приложение, в котором я получаю данные из sqlite в переработчик. Возможности, предоставляемые утилите просмотра, могут быть перетаскивать элемент программы просмотра и удалять их при замене. После перетаскивания я удаляю всю таблицу базы данных и сохраняю новый массив, содержащий элемент в обновленном порядке после перетаскивания. Я также делаю то же самое, удаляя и сохраняя вещи после удаления элемента подкачкой. Возникла проблема при удалении элемента после замены, я решил эту проблему, сбросив элемент адаптера (используя notifyDataSetChanged()
) после события перетаскивания, чтобы во время удаления был доступен новый список позиций элемента.
Теперь перейдем к тому, что является текущей проблемой:
Для проверки, произошло ли событие перетаскивания или нет, я использую флаг (логическое значение) внутри одного вмешательства, этот интерфейс вызывается только в том случае, если произошло событие перетаскивания. Таким образом, если это событие имеет значение true, тогда удаление данных и сохранение нового списка в базе данных и вызов notifyDataSetChanged()
. Проблема в том, что если я перетаскиваю хотя бы один элемент, флаг возвращает true, потому что вызывается notifyDataSetChanged()
, поэтому я не могу перетаскивать позицию элемента более чем на единицу, если пользователь хочет перетащить элемент после двух или трех элементов, которые он не может.
Так что в любом случае я могу использовать notifyDataSetChanged
после того, как все события перетаскивания завершены, в настоящее время можно перетащить только одну позицию.
Код внутри адаптера для перетаскивания.
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(customDataListModels, i, i + 1);
}
Log.e("UpTODown", String.valueOf(toPosition));
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(customDataListModels, i, i - 1);
}
Log.e("DownToUp", String.valueOf(toPosition));
}
Log.e("postion", "from pos : "+String.valueOf(fromPosition)+" : to Position :"+String.valueOf(toPosition));
mListChangedListener.onNoteListChanged(customDataListModels);
notifyItemMoved(fromPosition, toPosition);
chCustom=customDataListModels;
if (swapChecker == true) {
tempSqliteDatabaseHelper.deleteall();
for (int i = 0; i < chCustom.size(); i++) {
Log.e("PositionInSwap", String.valueOf(chCustom.get(i).getName()));
tempinsert(chCustom.get(i).getName(), chCustom.get(i).getNumber(), chCustom.get(i).getColor(), chCustom.get(i).getFSize(), 1);
}
notifyDataSetChanged();
}
return true;
}
В приведенном выше коде swapChecker == true имеет значение true, когда произошло событие перетаскивания.
@Override
public void onNoteListChanged(List<CustomDataListModel> customDataListModels) {
swapChecker = true;
}
метод tempinsert хранится в базе данных. который вообще не связан с текущей проблемой, если вам интересно узнать код:
public void tempinsert(String name, String num, String color, int size, int index) {
boolean inSamedata = tempSqliteDatabaseHelper.IsItemExist(name, num);
if (inSamedata == false) {
boolean indata = tempSqliteDatabaseHelper.insertData(new ContactModel(name, num, color, size, index));
if (indata == true) {
Log.e("DataSave", "DataSave");
} else {
Log.e("In_Data_not_True", "In Data not True");
}
} else if (inSamedata == true) {
Log.e("Record_Exist", "Record Exist");
}
}
Интерфейс, который реализован в адаптере:
public class CustomRecycleAdapter extends RecyclerView.Adapter<CustomRecycleAdapter.MyContactHolder> implements ItemTouchHelperAdapter{
}
public interface ItemTouchHelperAdapter {
}
void onRowSelected(CustomRecycleAdapter.MyContactHolder myViewHolder);
void onRowClear(CustomRecycleAdapter.MyContactHolder myViewHolder);
boolean onItemMove(int fromPosition, int toPosition);
}
onItemMove вызвал метод onMove класса SimpleItemTouchHelperCallback, который расширяется из класса ItemTouchHelper.Callback
public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {
private final ItemTouchHelperAdapter mAdapter;
public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
mAdapter = adapter;
}
@Override
public boolean isLongPressDragEnabled() {
return true;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
return makeMovementFlags(dragFlags, 0);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
RecyclerView.ViewHolder target) {
mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
}
Я разместил код интерфейса и код под ним, потому что какой-то пользователь предложил мне использовать методы переопределения onRowSelected и onRowClear. но я замечаю, что не могу использовать этот метод напрямую. Поэтому я извлекаю этот метод из интерфейса.