<linearLayoutxmlns:androID="http://schemas.androID.com/apk/res/androID"androID:layout_wIDth="fill_parent"androID:layout_height="160dp"><ImageVIEw androID:ID="@+ID/product_variation_image" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:scaleType="centerCrop" androID:layout_gravity="center"/>
这是Adaper:
public class TestAdapter extends RecyclerVIEw.Adapter<TestAdapter.VIEwHolder> {private String[] mDataset;public static class VIEwHolder extends RecyclerVIEw.VIEwHolder { public ImageVIEw mImageVIEw; public VIEwHolder(VIEw v) { super(v); mImageVIEw = (ImageVIEw) v.findVIEwByID(R.ID.product_variation_image); }}public TestAdapter(String[] myDataset) { mDataset = myDataset;}@OverrIDepublic TestAdapter.VIEwHolder onCreateVIEwHolder(VIEwGroup parent,int vIEwType) { // create a new vIEw VIEw v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.variaton_List_item,parent,false); VIEwHolder vh = new VIEwHolder(v); return vh;}@OverrIDepublic voID onBindVIEwHolder(VIEwHolder holder,int position) { holder.mImageVIEw.setimageDrawable(null); String url = mDataset[position]; Log.i("TEST","position = " + position); ((MainActivity)MainActivity.getInstance()).imageDownloader.download(url,holder.mImageVIEw);}@OverrIDepublic int getItemCount() { return mDataset.length;}
下载方法从URL获取图像,或者如果已经缓存,则从内存中获取图像.这适用于所有其他布局,例如ListVIEw或GrIDVIEw.这是我在片段中设置它的代码:
final linearlayoutmanager layoutManager = new linearlayoutmanager(getActivity()); layoutManager.setorIEntation(linearlayoutmanager.HORIZONTAL); mRecyclerVIEw.setLayoutManager(layoutManager);
这是在onCreateVIEw方法中.当我获取网址时,我填充它们并使用以下方法设置适配器:
myDataset[i] = imageURL; // for each image mAdapter = new TestAdapter(myDataset); mRecyclerVIEw.setAdapter(mAdapter);
有趣的是适配器中onBindVIEwHolder方法中的行,我记录位置.我发现没有显示图像的单元格是没有调用此方法.就像它出于某种原因跳过那个细胞一样.更奇怪的是,如果我按住一个单元格并继续从左向右滑动,如果一个单元格离开屏幕然后又重新进入,那么它的图像就会再次被调用onBindVIEwHolder方法.
解决方法 我认为不重要的一个类是造成这个问题的一个类.我不确定是什么原因,但它存在于我用于从BitmapFun示例获得的回收的自定义ImageVIEw类中.public class RecyclingImageVIEw extends ImageVIEw { public RecyclingImageVIEw(Context context) { super(context); } public RecyclingImageVIEw(Context context,AttributeSet attrs) { super(context,attrs); } /** * @see androID.Widget.ImageVIEw#onAttachedToWindow() */ @OverrIDe protected voID onAttachedToWindow() {} /** * @see androID.Widget.ImageVIEw#onDetachedFromWindow() */ @OverrIDe protected voID onDetachedFromWindow() { // This has been detached from Window,so clear the drawable setimageDrawable(null); super.onDetachedFromWindow(); } /** * @see androID.Widget.ImageVIEw#setimageDrawable(androID.graphics.drawable.Drawable) */ @OverrIDe public voID setimageDrawable(Drawable drawable) { // Keep hold of prevIoUs Drawable final Drawable prevIoUsDrawable = getDrawable(); // Call super to set new Drawable super.setimageDrawable(drawable); // Notify new Drawable that it is being displayed notifyDrawable(drawable,true); // Notify old Drawable so it is no longer being displayed notifyDrawable(prevIoUsDrawable,false); } /** * NotifIEs the drawable that it's displayed state has changed. * * @param drawable * @param isdisplayed */ private static voID notifyDrawable(Drawable drawable,final boolean isdisplayed) { if (drawable instanceof RecyclingBitmapDrawable) { // The drawable is a CountingBitmapDrawable,so notify it ((RecyclingBitmapDrawable) drawable).setIsdisplayed(isdisplayed); } else if (drawable instanceof LayerDrawable) { // The drawable is a LayerDrawable,so recurse on each layer LayerDrawable layerDrawable = (LayerDrawable) drawable; for (int i = 0,z = layerDrawable.getNumberOfLayers(); i < z; i++) { notifyDrawable(layerDrawable.getDrawable(i),isdisplayed); } } }}
当我用普通的ImageVIEw替换它时,我不再遇到问题.
总结以上是内存溢出为你收集整理的android – RecyclerView消失的图像全部内容,希望文章能够帮你解决android – RecyclerView消失的图像所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)