android - 拖放 Recyclerview 项目后,如何在适配器的 onbind 方法中提供列表项目的更新位置

标签 android android-recyclerview

我有一个应用程序,我在其中从数据库中获取数据到 Recyclerview。我正在通过拖放更改 recyclerview 项目的位置,在拖放时我得到更新的 ArrayList 并插入到 Sqlite 中。

我还删除了左侧交换区的项目。当我在拖放后删除项目时出现问题。拖放后,item 的新位置没有到达删除功能。看完代码你会更好地理解这个问题。

Adapter 的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,同时删除了该项目。

如前所述,问题发生在拖放之后。当我在拖放后删除时,它正在删除旧的位置项。那么如何在 onbind 拖放后提供新位置呢?

如果您需要更多代码或屏幕截图,请询问我,我会发布它们。

最佳答案

据我猜测,问题是您的 RecyclerView 仍然有一个以前的数据集,因此在滑动后旧位置而不是新位置。

我有一个有点类似的问题,我通过在滑动后重新连接我的适配器来修复它。

我有一个开源项目,您可以通过拖放和滑动来查看以删除 recyclerview,here .查看 TaskActivity.java 的 resetAdapter()。

resetAdapter 方法:

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

关于android - 拖放 Recyclerview 项目后,如何在适配器的 onbind 方法中提供列表项目的更新位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55095344/

相关文章:

android - 如何在Kotlin中将onClickListener添加到recyclerView的项目中?

Android:adbd 无法在生产版本中以 root 身份运行

android - RecyclerView ?android :attr/selectableItemBackground does not work on items

android - fragment 没有膨胀

android - 在android中过滤垃圾文件

android - 多个ViewHolder RecycleVIew列表重新排列

android:windowBackground 不适用于 RecyclerView

单击后android更改按钮背景颜色

android - 使用 parse.com 制作聊天应用程序并选择收件人

android - 如果scaleType 为centerCrop,Glide RoundedCornersTransformation 不会进行任何更改