Я новичок в Android. и я создал один пейджер просмотра, который извлекает изображение из базы FireBase. и работает нормально. но в этом пейджере просмотра есть некоторые лазейки, которые мне не удалось решить.
1) Мой View-пейджер не получает обновления в режиме реального времени. Имеется в виду, когда я изменяю изображение в Firebase. это не влияет в режиме реального времени. Я должен закрыть свое приложение и затем запустить его снова, чтобы увидеть эти обновления.
2) Когда я удаляю элемент из моего списка в Firebase. Мое приложение падает, и в Logcat выбрасывается это исключение.
java.lang.IndexOutOfBoundsException: Index: -1, Size: 5
at java.util.ArrayList.add(ArrayList.java:483)
at com.release.pack.lootbox.Fragments.HomeFragment$7.onEvent(HomeFragment.java:294)
at com.release.pack.lootbox.Fragments.HomeFragment$7.onEvent(HomeFragment.java:281)
Вот мой код:
Адаптер слайдера:
public class SliderImageAdapter extends SliderViewAdapter<SliderImageAdapter.SliderAdapterVH> {
public List<Banner> bannerList;
public Context context;
public SliderImageAdapter(Context context, List<Banner> bannerList) {
this.bannerList = bannerList;
this.context = context;
}
@Override
public SliderAdapterVH onCreateViewHolder(ViewGroup parent) {
View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.image_slider_myshop, parent, false);
return new SliderAdapterVH(inflate);
}
@Override
public void onBindViewHolder(final SliderAdapterVH viewHolder, final int position) {
Glide.with(viewHolder.itemView)
.load(bannerList.get(position).getmSliderImage())
.fitCenter()
.into(viewHolder.imageViewBackground);
}
@Override
public int getCount() {
return bannerList.size();
}
class SliderAdapterVH extends SliderViewAdapter.ViewHolder {
View itemView;
ImageView imageViewBackground;
ImageView imageGifContainer;
TextView textViewDescription;
public ProgressBar progressBar;
public ImageView imageViewFailed;
public SliderAdapterVH(View itemView) {
super(itemView);
imageViewBackground = itemView.findViewById(R.id.iv_auto_image_slider);
imageGifContainer = itemView.findViewById(R.id.iv_gif_container);
textViewDescription = itemView.findViewById(R.id.tv_auto_image_slider);
progressBar = itemView.findViewById(R.id.featured_deal_progress);
imageViewFailed = itemView.findViewById(R.id.featured_deal_img_failed_to_load);
this.itemView = itemView;
}
}
}
Фрагмент дома:
private SliderImageAdapter sliderImageAdapter;
private List<Banner> bannerList;
bannerList = new ArrayList<>();
sliderImageAdapter = new SliderImageAdapter(getActivity(),bannerList);
sliderMyshop = view.findViewById(R.id.imageSlider);
sliderMyshop.setSliderAdapter(sliderImageAdapter);
sliderMyshop.setIndicatorAnimation(IndicatorAnimations.WORM); //set indicator animation by using SliderLayout.IndicatorAnimations. :WORM or THIN_WORM or COLOR or DROP or FILL or NONE or SCALE or SCALE_DOWN or SLIDE and SWAP!!
sliderMyshop.setSliderTransformAnimation(SliderAnimations.SIMPLETRANSFORMATION);
sliderMyshop.setIndicatorSelectedColor(Color.WHITE);
sliderMyshop.setIndicatorUnselectedColor(Color.GRAY);
sliderMyshop.startAutoCycle();
mFirestore.collection("Banner").orderBy("priority", Query.Direction.DESCENDING).addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@javax.annotation.Nullable QuerySnapshot documentSnapshots, @javax.annotation.Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.d(TAG, "Error : " + e.getMessage());
}
assert documentSnapshots != null;
for (DocumentChange doc : documentSnapshots.getDocumentChanges()) {
if (doc.getType() == DocumentChange.Type.ADDED) {
String doc_id = doc.getDocument().getId();
Banner banner = doc.getDocument().toObject(Banner.class).withDocId(doc_id);
bannerList.add(doc.getNewIndex(), banner);
sliderImageAdapter.notifyDataSetChanged();
} else if (doc.getType() == DocumentChange.Type.MODIFIED) {
String docID = doc.getDocument().getId();
Banner changedModel = doc.getDocument().toObject(Banner.class).withDocId(docID);
if (doc.getOldIndex() == doc.getNewIndex()) {
// Item changed but remained in same position
bannerList.set(doc.getOldIndex(), changedModel);
// sliderImageAdapter.notifyItemChanged(doc.getOldIndex());
} else {
// Item changed and changed position
bannerList.remove(doc.getOldIndex());
bannerList.add(doc.getNewIndex(), changedModel);
// sliderImageAdapter.notifyItemMoved(doc.getOldIndex(), doc.getNewIndex());
}
} else if (doc.getType() == DocumentChange.Type.REMOVED) {
// remove
bannerList.remove(doc.getOldIndex());
// sliderImageAdapter.notifyItemRemoved(doc.getOldIndex());
}
}
}
});
Когда я добавляю новое изображение в firebase, оно обновляется в режиме реального времени. но не когда я делаю изменения в моем изображении. или удалив элемент из моего списка.
1 ответ
Быть разбитым
bannerList.add(doc.getNewIndex(), banner);
Эта строка является причиной возникновения IndexOutOfBoundsException .
(java.lang.IndexOutOfBoundsException: Index: -1, Size: 5)
doc.getNewIndex()
возвращает -1 . и список не может принять -1 в качестве индекса. пожалуйста, проверьте ваш doc.getNewIndex()
.
Для обновления в реальном времени
bannerList.clear();
добавьте этот код перед циклом for , в противном случае будут добавлены избыточные данные, и вы не сможете обновить новые изменения.
Видеть это : Обработчик снимка будет получать новый снимок запроса каждый раз, когда результаты запроса изменяются (то есть, когда документ добавляется, удаляется или изменяется).
для каждого изменения будет выбрана вся коллекция
Похожие вопросы
Новые вопросы
java
Java - это популярный язык программирования высокого уровня. Используйте этот тег, если у вас есть проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [gradle] и [maven].