После перетаскивания элемента Recyclerview, как я могу указать обновленную позицию элемента списка в методе onbind адаптера

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

У меня есть приложение, в котором я извлекаю данные из базы данных в Recyclerview . Я изменяю позицию элемента recyclerview путем перетаскивания, и во время перетаскивания я получаю обновленный элемент recyclerview ArrayList и вставляю в Sqlite .

Я также удаляю элемент при левой замене. Проблема возникает, когда я удаляю элемент после перетаскивания. После перетаскивания новая позиция элемента не отображается при функции удаления. Вы лучше поймете эту проблему после ознакомления с кодом.

Код onbind адаптера: я публикую только код, связанный с проблемой

   @Override
    public void onBindViewHolder(@NonNull final MyContactHolder myContactHolder, final int i) {


        Log.e("poistionINAdapter:", String.valueOf(i));

        myContactHolder.DeleteText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                removeflag=true;
                customDataListModels.notify();
                customDataListModels.remove(i);
                notifyItemRemoved(i);
                notifyItemChanged(i, customDataListModels.size());
                Log.e("removeItem", String.valueOf(customDataListModels.toString()));
                reCustom=customDataListModels;

                if (removeflag == true) {
                    tempSqliteDatabaseHelper.deleteall();
                    for (int i = 0; i < reCustom.size(); i  ) {
                        Log.e("chname", String.valueOf(reCustom.get(i).getName()));
                        tempinsert(reCustom.get(i).getName(), reCustom.get(i).getNumber(), reCustom.get(i).getColor(), reCustom.get(i).getFSize(), 1);
                    }
                }
            }
        });
}
  

Код при перетаскивании: это также находится внутри адаптера

  @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);
                customDataListModels=chCustom;
            }
        }
        return true;
    }
  

Как вы можете видеть, при перетаскивании я удаляю всю таблицу sqlite и вставляю новую обновленную arraylist , одновременно с удалением элемента.

Как я уже упоминал, проблема возникает после перетаскивания. Когда я удаляю после перетаскивания, это удаляет старый элемент position. Итак, как я могу указать новую позицию после перетаскивания в onbind?

Если вам потребуется еще какой-либо код или снимки экрана, спросите меня, и я опубликую их.

Комментарии:

1. Можете ли вы добавить класс и методы, которые вы используете для сохранения ваших данных в базе данных? Также ваш класс объекта данных chCustom.

2. Я обновил post, но это не проблема, я читаю базу данных при каждом событии, и все в порядке, проблема в том, что после перетаскивания не обновляется позиция

3. Проблема, насколько я могу догадаться, заключается в том, что ваш RecyclerView все еще имеет предыдущий набор данных и, следовательно, старые позиции вместо новых после прокрутки. У меня была несколько похожая проблема, и я исправил ее, повторно подключив свой адаптер после прокрутки. У меня есть проект с открытым исходным кодом, который вы можете просмотреть с помощью перетаскивания и проведите пальцем, чтобы удалить recyclerview — github.com/mdnaseemashraf/Memento2 Посмотрите на TaskActivity.java это resetAdapter().

4. Ваш ответ на месте, спасибо, это был отличный вывод.

5. Я изменю свой комментарий на ответ. Пожалуйста, примите это. 🙂

Ответ №1:

Проблема, насколько я могу догадаться, заключается в том, что ваш RecyclerView все еще имеет предыдущий набор данных и, следовательно, старые позиции вместо новых после прокрутки.

У меня была несколько похожая проблема, и я исправил ее, повторно подключив свой адаптер после салфетки.

У меня есть проект с открытым исходным кодом, который вы можете просмотреть с помощью перетаскивания и проведите пальцем, чтобы удалить recyclerview, здесь. Посмотрите на TaskActivity.java это resetAdapter().

Метод resetAdapter:

 public void resetAdapter(){
    mAdapter = new TasksAdapter(taskList,TaskActivity.this);
    mRecyclerView.setAdapter(mAdapter);
    mAdapter.notifyItemRangeChanged(0,taskList.size());
}