android – RecyclerView.Adapter onBindViewHolder()获取错误的位置

android – RecyclerView.Adapter onBindViewHolder()获取错误的位置,第1张

概述我将展示代码并在解决问题的步骤之后. 我在一个标签片段中有一个recyclerview,它从自定义对象中获取数据集: mRecyclerView = (RecyclerView) v.findViewById(R.id.recyclerview);mRecyclerView.setLayoutManager(mLayoutManager);mRecyclerAdapter = new My 我将展示代码并在解决问题的步骤之后.

我在一个标签片段中有一个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])?

我不知道会出现什么问题.所以我请求帮助,因为我正在考虑放弃这个项目,因为我做的一切都是正确的,但总是有些东西不起作用,我累了.
提前致谢.

解决方法 我注意到在方法onBindVIEwHolder(VH holder,int position)中,当位置出错时,holder.getAdapterposition()总是给我正确的位置.

所以我改变了我的代码:

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()获取错误的位置所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1136422.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存