我将显示代码并执行解决问题的步骤。RecyclerView.Adapter onBindViewHolder()获取错误的位置
我有一个标签片段,是以数据集从一个自定义对象内recyclerview:
mRecyclerView = (RecyclerView) v.findViewById(R.id.recyclerview);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerAdapter = new MyRecyclerAdapter(mMes.getListaItens(), this, getActivity());
mRecyclerView.setAdapter(mRecyclerAdapter);
我设置列表项的longclick行为适配器的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;
}
现在我要重现步骤: 我展示在ListView 3个itens。然后我尝试删除第一:
所以,如果我尝试删除此2项列表的第一个项目,我得到了错误的POSI重刑(应该是0,1):
并且如果我尝试删除此2项列表,我得到了错误的位置的最后一个项目(应为1,是2): 如果我有一个大小为2(和适配器知道它)的数据集,它如何可以调用onBindViewHolder(ViewHolder持有人,int [最后索引+1])?
我不知道什么可能是错的。所以我请求帮助,因为我正在考虑放弃这个项目,因为我做的一切都是正确的,但总是不起作用,我很累。 在此先感谢。
您还需要包含您的适配器代码。这很可能是因为您的适配器没有正确处理'删除'。它需要减少它的总数。如果您使用的是简单的ID列表,那么您将遇到一个问题,您的视图也需要重新创建。 –
没有看到完整的代码,很难肯定地说。 –
告诉你想要哪个部分,然后发布,如果我把所有东西都写成了坏的。也许我可以在bitbucket上粘贴一些文件的url ... – Informatheus