Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android “回收器视图”在滚动条上洗牌图像_Android_Android Recyclerview - Fatal编程技术网

Android “回收器视图”在滚动条上洗牌图像

Android “回收器视图”在滚动条上洗牌图像,android,android-recyclerview,Android,Android Recyclerview,我有一个recycler视图,它正在使用Universal Image Loader进行填充 @Override public MasonryView onCreateViewHolder(ViewGroup parent, int viewType) { View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_item, parent, false); MasonryVie

我有一个recycler视图,它正在使用Universal Image Loader进行填充

@Override
public MasonryView onCreateViewHolder(ViewGroup parent, int viewType) {
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_item, parent, false);
    MasonryView masonryView = new MasonryView(layoutView);
    //layoutView.setOnClickListener(new MyOnClickListener());
    //imageLoader.destroy();
    imageLoader.init(ImageLoaderConfiguration.createDefault(context));
    options = new DisplayImageOptions.Builder()
            .cacheInMemory(true)
            .resetViewBeforeLoading(true)
            .cacheOnDisk(true)
            .considerExifParams(false)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .build();

    return masonryView;
}

@Override
public void onBindViewHolder(final MasonryView holder, int position) {

    imageLoader
            .displayImage(IMAGE_URLS[position], holder.imageView, options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingStarted(String imageUri, View view) {
                    holder.donut_progress.setVisibility(View.VISIBLE);
                    holder.donut_progress.setProgress(0);
                }

                @Override
                public void onLoadingFailed(String imageUri, View view, FailReason failReason) {

                    holder.onLoadImage.setVisibility(View.GONE);
                }

                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    holder.onLoadImage.setVisibility(View.GONE);
                    holder.donut_progress.setVisibility(View.GONE);
                }
            }, new ImageLoadingProgressListener() {
                @Override
                public void onProgressUpdate(String imageUri, View view, int current, int total) {
                    holder.donut_progress.setProgress(Math.round(100.0f * current / total));
                }
            });


}
正如您所见,imageloader和DisplayOptions是在CreateView中定义的

图像显示成功,但在滚动图像时,图像会乱序

以下是我的自定义回收器网格项目的xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00000000"
android:orientation="vertical">

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"/>
    !-- android:scaleType="centerCrop" --!


    <ImageView
        android:id="@+id/onLoadImage"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/camera_cross"
        android:layout_marginLeft="50dp"
        android:layout_marginTop="50dp"
        android:visibility="gone"/>

    <progressIndicators.DonutProgress
        android:layout_marginLeft="50dp"
        android:layout_marginTop="50dp"
        android:id="@+id/donut_progress"
        android:layout_width="50dp"
        android:layout_height="50dp"
        custom:donut_unfinished_stroke_width="1dp"
        custom:donut_finished_stroke_width="1dp"
        custom:donut_progress="50"/>

</FrameLayout>

!-- android:scaleType=“centerCrop”-!
我的主要片段,有回收视图

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.RecyclerView
    android:id="@+id/masonry_grid"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="0.1"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />


</LinearLayout>

不过,我也设置了
adapter.setHassTableId(true)

通用映像加载程序异步任务操作。在Universal image loader中,他们使用了OkHTTP客户机-服务器操作。这就是你的图像被洗牌的原因。尝试使用它来加载图像是更好的方法。再看看这个例子

加载图像的简单、方便、快捷的方法。
Glide.with(itemView.getContext()).load(Datas.getRequestURL()).centerCrop().into(mStaticMap)

在加载原始图像之前显示占位符,同样的问题也发生在我的案例中,所以我采用了这种方法

在启动程序(第一个)活动中执行此操作

//自定义显示选项

    DisplayImageOptions options = new DisplayImageOptions.Builder()
        .showImageOnFail(R.drawable.placeholder_steve)
        .showImageForEmptyUri(R.drawable.placeholder_steve)
        .showImageOnLoading(R.drawable.placeholder_steve)
        .bitmapConfig(Bitmap.Config.RGB_565)
        .considerExifParams(true)
        .cacheInMemory(true)
        .cacheOnDisk(true)
        .build(); 
//配置

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
        .defaultDisplayImageOptions(options)
      /*.diskCache(lruDiskCache)*/
        .build();
ImageLoader.getInstance().init(config);

我彻底解决了这个问题

问题是我的回收箱的高度和宽度

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.RecyclerView
    android:id="@+id/masonry_grid"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.1"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />


</LinearLayout>

我必须设置包装内容的高度和宽度。

问题在于

holder.onLoadImage.setVisibility(View.GONE)

您必须谨慎设置可见性,然后使其可见。最后,它是显示和未显示可见性的同一视图保持架。如果你保证

holder.onLoadImage.setVisibility(View.VISIBLE)


在onBindHolder()的开头,您应该可以发布您的xml代码。好的,我发布我的自定义项目。xml您在您的recycler视图中添加了android:scrollbars=“vertical”请检查我的recyclerview Widget。您必须知道的一件事是,recyclerview在每10个视图之后都会重用视图。所以你从构造器得到的位置并不是你所期望的。问题不在布局中。结果甚至是最糟糕的。我有一个循环的过程,直到图像成功loaded@AbdulAhad我没有尝试循环进度,但没有进度,它可以工作。最初设置位图为可绘制图像,直到加载原始图像。最终位图thumbBitmap=BitmapFactory.decodeResource(context.getResources(),R.drawable.placeholder_);问题依然存在:(最糟糕的是,它显示了图像从一个地方切换到另一个地方,但最终以特定的方式结束location@AbdulAhad inside onLoadingStarted()方法,使用默认的image holder.setImageBitmap(拇指位图)设置imageview,inside onLoadingComplete()方法使用原始图像设置holder.setImageBitmap(加载图像)。