Есть ли способ получить время перетаскивания события в окне повторного просмотра? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть приложение, в котором я получаю данные из 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. но я замечаю, что не могу использовать этот метод напрямую. Поэтому я извлекаю этот метод из интерфейса.

1 Ответ

0 голосов
/ 28 марта 2019
**IN RECYCLER VIEW ADAPTER**

@Override
public void onRowSelected(MyViewHolder myViewHolder) {
    //called when user select item and start dragging.
    //So, here you can start timer

}

@Override
public void onRowClear(MyViewHolder myViewHolder) {
    // called when user drop the item
    // here stop timer and calculate the time
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...