Как показать ProgressBar во время загрузки данных для RecyclerView?

134
17 августа 2019, 20:00

Есть RecyclerView с картинками, которые загружаются из интернета. Как надо подключить ProgressBar, пока данные для RecyclerView грузятся? Вот код фрагмента

public class TestFragment extends Fragment {
private ArrayList<GalleryGridObject> galleryList = new ArrayList<GalleryGridObject>();
private TestAdapter mAdapter;
private RecyclerView recyclerView;
int spanCount = 2; // 2 columns
public TestFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_coupons, container, false);
    recyclerView = (RecyclerView) view.findViewById(R.id.my_recycler_view);
    mAdapter = new TestAdapter(this, galleryList);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(mAdapter);
    recyclerView.setHasFixedSize(true);
    prepareGalleryData();
    return view;
}
private void prepareGalleryData()
{
    GalleryGridObject gallery = new GalleryGridObject("https://firebasestorage.googleapis.com/v0/b/socialapp-217e6.appspot.com/o/KFC%2F16.jpg?alt=media&token=c2bb063b-3a72-4511-9a09-7679eaea1422");
    galleryList.add(gallery);
    gallery = new GalleryGridObject("https://firebasestorage.googleapis.com/v0/b/socialapp-217e6.appspot.com/o/KFC%2F16.jpg?alt=media&token=c2bb063b-3a72-4511-9a09-7679eaea1422");
    galleryList.add(gallery);
    gallery = new GalleryGridObject("https://firebasestorage.googleapis.com/v0/b/socialapp-217e6.appspot.com/o/KFC%2F16.jpg?alt=media&token=c2bb063b-3a72-4511-9a09-7679eaea1422");
    galleryList.add(gallery);
    gallery = new GalleryGridObject("https://firebasestorage.googleapis.com/v0/b/socialapp-217e6.appspot.com/o/KFC%2F16.jpg?alt=media&token=c2bb063b-3a72-4511-9a09-7679eaea1422");
    galleryList.add(gallery);
    gallery = new GalleryGridObject("https://firebasestorage.googleapis.com/v0/b/socialapp-217e6.appspot.com/o/KFC%2F16.jpg?alt=media&token=c2bb063b-3a72-4511-9a09-7679eaea1422");
    galleryList.add(gallery);
    gallery = new GalleryGridObject("https://firebasestorage.googleapis.com/v0/b/socialapp-217e6.appspot.com/o/KFC%2F16.jpg?alt=media&token=c2bb063b-3a72-4511-9a09-7679eaea1422");
    galleryList.add(gallery);
    gallery = new GalleryGridObject("https://firebasestorage.googleapis.com/v0/b/socialapp-217e6.appspot.com/o/KFC%2F16.jpg?alt=media&token=c2bb063b-3a72-4511-9a09-7679eaea1422");
    galleryList.add(gallery);
    gallery = new GalleryGridObject("https://firebasestorage.googleapis.com/v0/b/socialapp-217e6.appspot.com/o/KFC%2F16.jpg?alt=media&token=c2bb063b-3a72-4511-9a09-7679eaea1422");
    galleryList.add(gallery);
    mAdapter.notifyDataSetChanged();
}
}
Answer 1

Есть еще другой вариант. Для этого вам нужно просто подключить библиотеку universalimageloader и потом нужно создать класс.

вот такой:

public class UniversalImageLoader {
private static final int defaultImage = R.drawable.defoult_image_loader;
private WeakReference<Context> mContext;
public UniversalImageLoader(Context context) {
    mContext = new WeakReference<Context>(context);
}

/** здесь устанавливается конфигурация
 * то есть в этом конфигурации написано,
 * пока изображения загружается показать дефолтовый изображения и потом загруженый файл кэшироват и сохранить в памяти,
 * что бы не загружать каждый раз из интернета.
 * если вам это не подходить, то вы можете написать свой.*/
public ImageLoaderConfiguration getConfig(){
    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .showImageOnLoading(defaultImage)
            .showImageForEmptyUri(defaultImage)
            .showImageOnFail(defaultImage)
            .considerExifParams(true)
            .cacheOnDisk(true).cacheInMemory(true)
            .cacheOnDisk(true).resetViewBeforeLoading(true)
            .imageScaleType(ImageScaleType.EXACTLY)
            .displayer(new FadeInBitmapDisplayer(300)).build();
    ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(mContext.get())
            .defaultDisplayImageOptions(defaultOptions)
            .memoryCache(new WeakMemoryCache())
            .diskCacheSize(100 * 1024 * 1024).build();
    return configuration;
}
public static void setImage(String imgURL, final ImageView image, final ProgressBar progressBar){
    ImageLoader imageLoader = ImageLoader.getInstance();
    imageLoader.displayImage( imgURL, image, new ImageLoadingListener() {
        @Override
        public void onLoadingStarted(String imageUri, View view) {
            if(progressBar != null){
                progressBar.setVisibility(View.VISIBLE);
            }
        }
        @Override
        public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
            if(progressBar != null){
                progressBar.setVisibility(View.GONE);
            }
        }
        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            if(progressBar != null){
                progressBar.setVisibility(View.GONE);
            }
        }
        @Override
        public void onLoadingCancelled(String imageUri, View view) {
            if(progressBar != null){
                progressBar.setVisibility(View.GONE);
            }
        }
    });
}

}

А затем вам нужно сперва установить конфигурацию в вашем activity или в fragment.

private void imageLoaderConfig(){
    UniversalImageLoader universalImageLoader = new UniversalImageLoader(activity);
    ImageLoader.getInstance().init(universalImageLoader.getConfig());
}

И после этого вы можете использовать ImageLoader где вы хотите. например вы хотите показать в RecyclerView. Для этого вам нужно вызвать метод setImage, в вашем адаптере.

UniversalImageLoader.setImage(imgUrl, imageView, progressBar);

И напоследок, что бы подключить universalimageloader вот ссылка:

https://github.com/nostra13/Android-Universal-Image-Loader/wiki/Quick-Setup

И еще прошу не ругать меня, если я где то ошибся, потому что я не силён на русском языке:))

Answer 2

Делайте загрузку данных в AsyncTask, в цикле, в котором загружаете данные с сервера, обновляйте через вызов publishProgress(), а в методе onProgressUpdate() обновляйте какой-то свой progressBar, смотря где он находится и что из себя представляет в вашем приложении. Вот пример AsyncTask, в методе doInBackGround нужно реализовать загрузку данных.

new LoadDataFromWeb().execute(FILE_URL);
class LoadDataFromWeb extends AsyncTask<String, String, String> {
    @Override
    protected String doInBackground(String... strings) {
        ...
        int readData;
        int total;
        int totalDataSize;
        while (readData = inputStream.read(buffer)) {
            total += readData;
            publishProgress("" + (int) ((total * 100) / totalDataSize));
        }
        return null;
    }
    @Override
    protected void onProgressUpdate(String... values) {
        ProgressDialogFragment fragment = getDialogFragment();
        if (fragment.getContext() != null) {
            fragment.setProgress(Integer.parseInt(progress[0]));
        } else {
            Log.d(TAG, "Fragment have null context");
        }
    }
}
READ ALSO
зачем две скобки вместе в конце кода?

зачем две скобки вместе в конце кода?

java зачем в конце блока }); стоит фигурная и круглая вместе вместе?

113
Вызвать переменную или целый метод в jsp

Вызвать переменную или целый метод в jsp

Есть метод,который парсит сайт и выводит рандомное слово,как мне этот метод засунуть в jsp страницу?чтобы на главной странице оно отображалось?

135
Организация файлов по методологии БЭМ

Организация файлов по методологии БЭМ

Интересует как правильно структурировать файлы в проекте, если я придерживаюсь методологии именования БЭМ (не весь стэк)Сейчас у меня следующая...

140
Плагин Ajax Load More конфликтует с Javascript

Плагин Ajax Load More конфликтует с Javascript

На Wordpress - мои посты выводятся через плагин Ajax Load MoreИ посты не реагируют на событие click();

119