I am using a RecyclerView.Adapter as the adapter of a ViewPager2, but its appears don´t work properly, sometimes, when the user swipe, the viewpager skip items, for example it´s in 1 and the user swipe to see the item 2, but the ViewPager go to item 3.
Also if I don´t change the visibility of the pageCount, or change the height of the page count to match-parent the problem is fixed, but this is not a option. The ViewPager is in a FrameLayout, a video of the problem:https://drive.google.com/file/d/1sx6ee0d46_Q7WmPglI4FF8VdYmD-E77r/view?usp=sharing
Adapter code:
public class ImagenesSlides extends RecyclerView.Adapter<ImagenesSlides.ViewHolderImagenes> {
private final TabLayout tabLayout;
private final TextView pageCount;
private Activity activity;
private ArrayList<Imagen> imagenes;
private boolean bajarResIma;
private int height;
private Timer timer;
public ImagenesSlides(Activity activity, ArrayList<Imagen> imagenes, boolean bajarResIma, int height, TextView pageCount, TabLayout tabLayout) {
this.activity = activity;
this.imagenes = imagenes;
this.bajarResIma = bajarResIma;
this.height=height;
this.pageCount=pageCount;
this.tabLayout=tabLayout;
}
@NonNull
@Override
public ViewHolderImagenes onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_imagen,parent,false);
return new ViewHolderImagenes(view);
}
@Override
public int getItemCount () {
return imagenes.size();
}
@Override
public void onBindViewHolder(@NonNull final ViewHolderImagenes holder, int position) {
try {
holder.setup(position);
imagenes.get(position).obtenereRequestCreator(activity.getApplicationContext())
.placeholder(R.drawable.ic_loading_image)
.error(R.drawable.ic_error_loading_image)
.resize((int) (tabLayout.getWidth()*0.95),height)
.into(holder.getImagen(), new Callback() {
@Override
public void onSuccess() {
if(bajarResIma){
new Thread(){
@Override
public void run() {
super.run();
//bajarResIma(holder.getImagen());
}
}.start();
}
}
@Override
public void onError(Exception e) {
e.printStackTrace();
}
});
}catch (Exception e){
e.printStackTrace();
}
}
public void add(int position,Imagen imagen) {
imagenes.add(position,imagen);
notifyItemInserted(position);
}
public void add(Imagen imagen) {
if(imagenes.size()==0){
add(imagenes.size(),imagen);
}else{
add(imagenes.size(),imagen);
}
}
public void remove(int currentItem) {
imagenes.remove(currentItem);
notifyItemRemoved(currentItem);
}
public class ViewHolderImagenes extends RecyclerView.ViewHolder {
private TouchImageView imagen;
public ViewHolderImagenes(@NonNull View itemView) {
super(itemView);
imagen = (TouchImageView) itemView;
}
public void setup(final int pos){
imagen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(activity, OpcionesImagen.class);
intent.putExtra(Constantes.KEY_IMAGEN,imagenes.get(pos));
//DatosCache.setBitMap(ImageUtils.obtenerBitmap(imagen));
activity.startActivity(intent);
}
});
}
public TouchImageView getImagen() {
return imagen;
}
public void setImagen(TouchImageView imagen) {
this.imagen = imagen;
}
}
public void attachTabLayoutToSlides(final ViewPager2 slideShow) {
if(timer==null){
timer=new Timer();
}
slideShow.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
pageCount.setVisibility(View.VISIBLE);
pageCount.setText(MessageFormat.format("{0}/{1}", slideShow.getCurrentItem() + 1, getItemCount()));
timer.clock(3000,new RunInFuture<Boolean, Boolean>(){
@Override
public void run() {
super.run();
}
@Override
public void onOk() {
super.onOk();
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
pageCount.setVisibility(View.INVISIBLE);
}
});
}
});
}
});
new TabLayoutMediator(tabLayout, slideShow,
new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
System.out.println(tab);
}
}
).attach();
}
}