我已经尝试使用新的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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)