android-RecyclerView-当未调用onBindViewHolder时,findViewHolderForPosition始终返回null

android-RecyclerView-当未调用onBindViewHolder时,findViewHolderForPosition始终返回null,第1张

概述我已经尝试使用新的RecyclerView小部件几天了,以为我已经设法创建了“水平”和“网格”布局,还克服了以下事实:它缺乏实现OnClickListener的简单方法(我使用了GreenRobot’sEventBus为此),我仍然很难选择一个项目并在整个回收过程中保留该状态(样式).这是我用于适配器的代码publ

我已经尝试使用新的RecyclerView小部件几天了,以为我已经设法创建了“水平”和“网格”布局,还克服了以下事实:它缺乏实现OnClickListener的简单方法(我使用了GreenRobot’s EventBus为此),我仍然很难选择一个项目并在整个回收过程中保留该状态(样式).

这是我用于适配器的代码

public class ArticuloItemAdapter extends RecyclerVIEw.Adapter<ArticuloItemAdapter.ItemHolder> {    private ArrayList<ArticuloObject> mItems;    private LayoutInflater mLayoutInflater;    private int mSize;    private int mSelectedposition;    private RecyclerVIEw mRecyclerVIEw;    public ArticuloItemAdapter(Context context, RecyclerVIEw rv, ArrayList<ArticuloObject> articulos) {        mLayoutInflater = LayoutInflater.from(context);        mItems=articulos ;             mSize = context.getResources()                .getDimensionPixelSize(R.dimen.icon);        mSelectedposition = -1;        mRecyclerVIEw = rv;    }    @OverrIDe    public ItemHolder onCreateVIEwHolder(VIEwGroup parent, int vIEwType) {        VIEw itemVIEw = mLayoutInflater.inflate(R.layout.gallery_recycler_row, parent, false);        return new ItemHolder(itemVIEw, this);    }    @OverrIDe    public voID onBindVIEwHolder(ItemHolder holder, int position) {              Ion.with(holder.getPicImageVIEw())                .placeholder(R.drawable.owner_placeholder)                .resize(mSize, mSize)                .centerCrop()                .error(R.drawable.owner_error)                .load(mItems.get(position).getUrl());        //Update the vIEws as they got recycled        if (mSelectedposition != position) {            holder.getPicImageVIEw().setBackgroundcolor(color.transparent);        } else {            holder.getPicImageVIEw().setBackgroundcolor(color.CYAN);        }    }    @OverrIDe    public int getItemCount() {        return mItems.size();    }    public int getSelectedposition() {        return mSelectedposition;    }    public voID setSelectedposition(int mSelectedposition) {        this.mSelectedposition = mSelectedposition;    }    public RecyclerVIEw getRecyclerVIEw() {        return mRecyclerVIEw;    }    /* required implementation of VIEwHolder to wrap item vIEw */    public class ItemHolder extends RecyclerVIEw.VIEwHolder implements            VIEw.OnClickListener {        private ArticuloItemAdapter mParent;        private ImageVIEw mPicImageVIEw;        public ItemHolder(VIEw itemVIEw, ArticuloItemAdapter parent) {            super(itemVIEw);            itemVIEw.setonClickListener(this);            mParent = parent;            mPicImageVIEw = (ImageVIEw) itemVIEw.findVIEwByID(R.ID.picture_image_vIEw);        }        public ImageVIEw getPicImageVIEw() {            return mPicImageVIEw;        }        @OverrIDe        public voID onClick(VIEw v) {            EventBus.getDefault().post(new OnArticuloCartaClickEvent(this, getposition()));            setItemActivated(v);        }        public voID setItemActivated(VIEw v) {            //Check position of prevIoUs selected item. The first time an item is selected, the prevIoUs position will be  -1            if (mParent.getSelectedposition() >= 0) {                 ItemHolder row = (ItemHolder) mParent.getRecyclerVIEw().findVIEwHolderForposition(mParent.getSelectedposition());                if (row != null) {                    row.getPicImageVIEw().setBackgroundcolor(color.transparent);                }            }            mParent.setSelectedposition(getposition());            v.findVIEwByID(R.ID.picture_image_vIEw).setBackgroundcolor(color.CYAN);        }    }}

现在,在上面显示的代码中,我要做的是跟踪以下内容:

I.在onClick(VIEw v)事件中:

>每当单击一个项目时,我都会调用setItemActivated方法
>在setItemActivated方法中,我检查selectedposition是否大于或等于0(当未选择任何项目时,默认值为-1).
>如果先前的条件为真,则尝试将VIEwHolder放置在该位置,并且如果该VIEw不为null,则将ImageVIEw的背景色改回其原始背景色(透明)
>使用getposition()将mSelectedposition的新值设置为当前位置
>最后,将当前VIEwHolder内ImageVIEw的背景色更改为其他颜色(本例中为CYAN)

二.在onBindVIEwHolder(ItemHolderholder,int position)方法中:

如果所选项目的位置(mSelectedposition)与
显示视图的位置,我更改了背景
ImageVIEw的颜色恢复为默认颜色.
否则,我将ImageVIEw的颜色更改为用于标识所选项目的颜色(青色).

只要RecyclerVIEw具有开始回收视图所需的大量项目,所有这些工作就可以正常进行.但是,如果不是这样,就像我的情况一样,我注意到findVIEwHolderForposition始终返回null,结果,我无法将先前选择的项目的颜色改回其默认颜色,因此最终得到的结果不是选择一项.

更糟糕的是,由于RecyclerVIEw不必回收任何东西,因此onBindVIEwHolder方法永远不会被调用,因此我不能指望内部代码来相应地调整项目的颜色.

拜托,如果有人能告诉我我在这里做错了什么,或者提出一些想法,我将不胜感激.不能完成像选择项目这样的基本工作实在令人沮丧.

提前致谢.

解决方法:

发生这种情况的原因是,当选定的项目发生更改时,您没有告诉RecyclerVIEw上一个项目无效.

而不是尝试手动设置,请执行以下 *** 作:

public voID setItemActivated(VIEw v) {   final int myPos = getAdapterposition();   if (myPos == RecyclerVIEw.NO_position) {       // very rare case where item is clicked but its adapter position        // is unkNown. ignore the event.       // See docs of getAdapterposition for details   }   final int prevSelected = mParent.getSelectedposition();   mParent.setSelectedposition(myPos);   if (prevSelected >= 0 && prevSelected < mParent.getItemCount()) {       mParent.notifyItemChanged(prevSelected);   }   mParent.notifyItemChanged(myPos);}

RecyclerVIEw将调用onBind以获取应更新的视图.您无需担心先前选择的项目在哪里.

总结

以上是内存溢出为你收集整理的android-RecyclerView-当未调用onBindViewHolder时,findViewHolderForPosition始终返回null全部内容,希望文章能够帮你解决android-RecyclerView-当未调用onBindViewHolder时,findViewHolderForPosition始终返回null所遇到的程序开发问题。

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

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

原文地址: https://outofmemory.cn/web/1088966.html

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

发表评论

登录后才能评论

评论列表(0条)

保存