Есть 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();
}
}
Есть еще другой вариант. Для этого вам нужно просто подключить библиотеку 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
И еще прошу не ругать меня, если я где то ошибся, потому что я не силён на русском языке:))
Делайте загрузку данных в 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");
}
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
java зачем в конце блока }); стоит фигурная и круглая вместе вместе?
Есть метод,который парсит сайт и выводит рандомное слово,как мне этот метод засунуть в jsp страницу?чтобы на главной странице оно отображалось?
Интересует как правильно структурировать файлы в проекте, если я придерживаюсь методологии именования БЭМ (не весь стэк)Сейчас у меня следующая...
На Wordpress - мои посты выводятся через плагин Ajax Load MoreИ посты не реагируют на событие click();