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()。你的答案就在现场。谢谢你,这是一个很好的线索。我会将我的评论改为回答。请接受。:)