我将展示代码以及获取问题的步骤。
我在选项卡片段中有一个RecyclerView,它从自定义对象中获取数据集:
然后,片段中负责删除项目本身的方法:
现在我将重现以下步骤:我在列表视图中显示了3个项目。然后我尝试删除第一个:
1- 长按被拦截并传递正确的索引:
2- 该项已从数据库中正确删除:
3- 在所有这些操作之后,正如预期的那样,适配器存储并显示2个项目...
如果我尝试删除这个包含两个项目的列表的第一个项目,我会得到错误的位置(应该是0,但是是1):
而且,如果我尝试删除这个包含两个项目的列表的最后一个项目,我会得到错误的位置(应该是1,但是是2):
问题是:如果我有一个大小为2的数据集(并且适配器知道它),它如何调用onBindViewHolder(ViewHolder holder, int [last index +1])?
我不知道出了什么问题。所以我请求帮助,因为我认为放弃这个项目,因为我做的一切都是正确的,但总是有些事情不能正常工作,让我感到疲倦。
提前致谢。
我在选项卡片段中有一个RecyclerView,它从自定义对象中获取数据集:
mRecyclerView = (RecyclerView) v.findViewById(R.id.recyclerview);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerAdapter = new MyRecyclerAdapter(mMes.getListaItens(), this, getActivity());
mRecyclerView.setAdapter(mRecyclerAdapter);
我在适配器的onBindViewHolder()方法中设置了列表项的长按行为:
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
ItemMes item = mListaItens.get((position));
holder.descricao.setText(item.getDescrição());
holder.valor.setText(MainActivity.decimalFormatWithCod.format(item.getValor()));
...
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
new MaterialDialog.Builder(mContext)
.title(holder.descricao.getText().toString())
.items(R.array.opcoes_longclick_item)
.itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() {
@Override
public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
switch (which) {
case 0:
mParentFragment.showUpdateItemDialog(position);
return true;
case 1:
mParentFragment.showDeleteItemDialog(position);
return true;
}
return false;
}
})
.show();
return true;
}
});
}
然后,片段中负责删除项目本身的方法:
public void showDeleteItemDialog(int position) {
final ItemMes item = mMes.getListaItens().get(position);
new MaterialDialog.Builder(getActivity())
.title("Confirmar Remoção")
.content("Tem certeza que deseja remover " + item.getDescrição() + "?")
.positiveText("Sim")
.negativeText("Cancelar")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
deleteItem(item);
}
})
.show();
}
public void deleteItem(ItemMes item) {
getMainActivity().deleteItemFromDatabase(item.getID());
int position = mMes.getListaItens().indexOf(item);
mMes.getListaItens().remove(position);
mRecyclerAdapter.notifyItemRemoved(position);
atualizaFragment();
}
最后,在活动中执行数据库操作的方法:
public int deleteItemFromDatabase(long id) {
SQLiteDatabase db = dataBaseHelper.getWritableDatabase();
String where = DBHelper.COLUNA_ID + " = ?";
String[] args = {String.valueOf(id)};
int rowsAffected = db.delete(DBHelper.TABELA_ITEM, where, args);
db.close();
return rowsAffected;
}
现在我将重现以下步骤:我在列表视图中显示了3个项目。然后我尝试删除第一个:
1- 长按被拦截并传递正确的索引:
![enter image description here](https://istack.dev59.com/Vw9CF.webp)
![enter image description here](https://istack.dev59.com/4IHbl.webp)
![enter image description here](https://istack.dev59.com/WQqGz.webp)
![The position = 1](https://istack.dev59.com/BOCQm.webp)
![enter image description here](https://istack.dev59.com/7vkAc.webp)
![enter image description here](https://istack.dev59.com/KCIMc.webp)