android – RecyclerView消失的图像

android – RecyclerView消失的图像,第1张

概述我想要创建的是一个水平滚动图库.我有一个RecyclerView(支持22.0.0).我遇到的问题是,当我滚动到最后然后向后滚动时,通常会丢失一个图像,有时会丢失两个图像.奇怪的是,当我不停地来回扫动时,可能会丢失不同的图像.这是项目的布局: <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"andro 我想要创建的是一个水平滚动图库.我有一个RecyclerVIEw(支持22.0.0).我遇到的问题是,当我滚动到最后然后向后滚动时,通常会丢失一个图像,有时会丢失两个图像.奇怪的是,当我不停地来回扫动时,可能会丢失不同的图像.这是项目的布局:
<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消失的图像所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存