Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 拖放Recyclerview项后,如何在适配器的onbind方法中提供列表项的更新位置_Android_Android Recyclerview - Fatal编程技术网

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

Android 拖放Recyclerview项后,如何在适配器的onbind方法中提供列表项的更新位置,android,android-recyclerview,Android,Android Recyclerview,我有一个应用程序,其中我将数据从数据库提取到Recyclerview。我通过拖放更改recyclerview项的位置,在拖放时,我得到一个更新的ArrayList,并插入到Sqlite 我还删除了左边的交换项。当我在拖放后删除项目时,会出现此问题。拖放后,项目的新位置不会在删除功能处显示。在阅读代码之后,您将更好地理解这个问题 适配器onbind的代码:我只发布与问题相关的代码 @Override public void onBindViewHolder(@NonNull final

我有一个应用程序,其中我将数据从数据库提取到
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);
                    }
                }
            }
        });
}
@覆盖
public void onBindViewHolder(@NonNull final MyContactHolder MyContactHolder,final int i){
Log.e(“positioninadapter:,String.valueOf(i));
myContactHolder.DeleteText.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
removeflag=true;
customDataListModels.notify();
customDataListModels.remove(i);
(i)删去第(i)款;
notifyItemChanged(i,customDataListModels.size());
Log.e(“removietem”,String.valueOf(customDataListModels.toString());
reCustom=customDataListModels;
如果(removeflag==true){
tempSqliteDatabaseHelper.deleteall();
对于(int i=0;i
拖放代码:这也在适配器内部

 @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;
    }
@覆盖
公共布尔onItemMove(int-fromPosition,int-toPosition){
如果(从位置<位置){
for(inti=fromPosition;itoPosition;i--){
交换(customDataListModels,i,i-1);
}
//Log.e(“DownToUp”,String.valueOf(toPosition));
}
Log.e(“Position”,“from pos:”+String.valueOf(fromPosition)+“:to Position:”+String.valueOf(toPosition));
mListChangedListener.onNoteListChanged(customDataListModels);
已移动的项目(从位置、位置);
chCustom=customDataListModels;
if(swapChecker==true){
tempSqliteDatabaseHelper.deleteall();
对于(int i=0;i
如您所见,在拖放时,我正在删除整个
sqlite表
,并在删除该项的同时插入一个新的更新的
arraylist

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


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

据我猜测,问题在于您的RecyclerView在刷卡后仍然有以前的数据集,因此是旧位置,而不是新位置

我有一个类似的问题,我通过在刷卡后重新连接适配器解决了这个问题

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

重置适配器方法

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

您可以添加用于在数据库中保存数据的类和方法吗?还有你的数据对象类chCustom。我更新了post,但这不是问题,我在每次事件中都在读取数据库,这完全没问题,问题是拖放后没有得到更新的位置。据我猜测,问题是你的RecyclerView仍然有以前的数据集,因此在滑动后是旧位置,而不是新位置。我有一个类似的问题,我通过在刷卡后重新连接适配器来修复它。我有一个开源项目,你可以通过拖放和滑动来删除recyclerview-查看TaskActivity.java的resetAdapter()。你的答案就在现场。谢谢你,这是一个很好的线索。我会将我的评论改为回答。请接受。:)