我有一个应用程序,在其中我从数据库中获取数据到Recyclerview
。我通过拖放来更改recyclerview项的位置,并且在拖放时我得到了更新的ArrayList
并插入到Sqlite
中。
我还删除了左交换项。在拖放后删除项目时会发生问题。拖放后,该项目的新位置不再具有删除功能。阅读完代码后,您将更好地理解这个问题。
适配器的绑定代码:我只发布与问题相关的代码
@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拖放后如何提供新职位呢?
如果您需要更多代码或屏幕截图,请问我,我会发布它们。
答案 0 :(得分:1)
据我所知,问题是您的RecyclerView仍然具有以前的数据集,因此在滑动后仍保留旧位置而不是新位置。
我遇到了类似的问题,并通过在滑动后重新连接适配器来解决了该问题。
我有一个开源项目,您可以通过拖放查看该项目,并滑动以删除recyclerview here。查看TaskActivity.java的resetAdapter()。
resetAdapter方法:
public void resetAdapter(){
mAdapter = new TasksAdapter(taskList,TaskActivity.this);
mRecyclerView.setAdapter(mAdapter);
mAdapter.notifyItemRangeChanged(0,taskList.size());
}