我在一个标签片段中有一个recyclervIEw,它从自定义对象中获取数据集:
mRecyclerVIEw = (RecyclerVIEw) v.findVIEwByID(R.ID.recyclervIEw);mRecyclerVIEw.setLayoutManager(mLayoutManager);mRecyclerAdapter = new MyRecyclerAdapter(mMes.getListaItens(),this,getActivity());mRecyclerVIEw.setAdapter(mRecyclerAdapter);
我在适配器的onBindVIEwHolder()中设置列表项的longclick行为:
@OverrIDepublic 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.然后我尝试删除第一个:
1 – 通过正确的索引拦截longclick:
2 – 项目已从数据库中正确删除:
3 – 完成所有这些之后,正如预期的那样,适配器正在存储并显示2个项目……
所以,如果我尝试删除这个2项列表的第一项,我得到错误的位置(应该是0,是1):
而且,如果我尝试删除这两个项目列表的最后一项,我得到错误的位置(应该是1,是2):
问题是:如果我有一个大小为2的数据集(并且适配器知道它),它如何调用onBindVIEwHolder(VIEwHolder holder,int [last index 1])?
我不知道会出现什么问题.所以我请求帮助,因为我正在考虑放弃这个项目,因为我做的一切都是正确的,但总是有些东西不起作用,我累了.
提前致谢.
所以我改变了我的代码:
Itemmes item = mListaItens.get((position));...mParentFragment.showUpdateItemDialog(position);...mParentFragment.showDeleteItemDialog(position);....
至:
Itemmes item = mListaItens.get((holder.getAdapterposition()));...mParentFragment.showUpdateItemDialog(holder.getAdapterposition());...mParentFragment.showDeleteItemDialog(holder.getAdapterposition());....
一切都运作良好.这很奇怪,但……谢谢大家.
总结以上是内存溢出为你收集整理的android – RecyclerView.Adapter onBindViewHolder()获取错误的位置全部内容,希望文章能够帮你解决android – RecyclerView.Adapter onBindViewHolder()获取错误的位置所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)