0

I implemented a pretty awesome viewpager2 by setting it to a recyclerView adapter, but I need more than just scrolling it.

What I want:

I need to get the views inside the layout which is adapted using RecyclerView.Adapter. Similarly the way listView.setOnItemClickListener works (with AdapterView.OnItemClickListener())

What I've done so far

My Activity code:

    final ViewPager2 viewPager2 = findViewById(R.id.tutorialViewPager);
        viewPager2.setAdapter(setupViewPager());

        viewPager2.setOffscreenPageLimit(3);
        viewPager2.getChildAt(0).setOverScrollMode(RecyclerView.OVER_SCROLL_NEVER);
        CompositePageTransformer transformer = new CompositePageTransformer();
        transformer.addTransformer(new MarginPageTransformer(20));
        transformer.addTransformer(new ViewPager2.PageTransformer() {
            @Override
            public void transformPage(@NonNull View page, float position) {
                float r = 1 - Math.abs(position);
                page.setScaleX(0.85f + r * 0.30f);
                page.setScaleY(0.85f + r * 0.30f);
                page.setAlpha(Math.max(0.4f, 1 - Math.abs(position)));

                Toast.makeText(Tutorial.this, String.valueOf(position), Toast.LENGTH_SHORT).show();
            }
        });
        viewPager2.setPageTransformer(transformer);
    }

    private TutorialSliderAdapter setupViewPager() {
        SharedPreferences sharedPreferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this);
        String RoleID = sharedPreferences.getString("ROLEID", "");
        ArrayList<ImageItem> imageItems = new ArrayList<ImageItem>();

        if (Objects.requireNonNull(RoleID).equals("1")) {
            imageItems.add(new ImageItem(R.drawable.permission1,"Permission","Roadiy uses this permission for getting location"));
            imageItems.add(new ImageItem(R.drawable.permission2,"Permission","Roadiy uses this permission for getting location"));
            imageItems.add(new ImageItem(R.drawable.permission3,"Permission","Roadiy uses this permission for getting location"));
        } else {
        }

        return new TutorialSliderAdapter(imageItems);
    }

Adapter code:

public class TutorialSliderAdapter extends RecyclerView.Adapter<TutorialSliderAdapter.ImageHolder> {

List<ImageItem> imageItems;

public TutorialSliderAdapter(List<ImageItem> imageItems) {
    this.imageItems = imageItems;
}

@NonNull
@Override
public ImageHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.image_in_slider, parent, false);

    return new ImageHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ImageHolder holder, int position) {
    holder.setValues(imageItems.get(position));
}

@Override
public int getItemCount() {
    return imageItems.size();
}

static class ImageHolder extends RecyclerView.ViewHolder {
    RoundedImageView Image;
    TextView Header;
    TextView Description;
    public ImageHolder(@NonNull View itemView) {
        super(itemView);
        Header = itemView.findViewById(R.id.header);
        Image = itemView.findViewById(R.id.image);
        Description = itemView.findViewById(R.id.description);
    }

    public void setValues(ImageItem imageItem) {
        Image.setImageResource(imageItem.getImageID());
        Header.setText(imageItem.getHeader());
        Description.setText(imageItem.getDescription());
    }
}
}

Layout whose views I want to retrieve:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"
android:gravity="center"
android:orientation="vertical">

<TextView
    android:id="@+id/header"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="20dp"
    android:fontFamily="sans-serif-medium"
    android:gravity="center"
    android:textColor="#35595E"
    android:textSize="24sp"
    android:textStyle="bold"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<com.makeramen.roundedimageview.RoundedImageView
    android:id="@+id/image"
    android:layout_width="match_parent"

    android:layout_height="250dp"
    android:adjustViewBounds="true"
    app:layout_anchorGravity="center"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/header"
    app:riv_corner_radius="12dp">

</com.makeramen.roundedimageview.RoundedImageView>

<TextView
    android:id="@+id/description"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:fontFamily="sans-serif-medium"
    android:gravity="center"
    android:textColor="#35595E"
    android:textSize="18sp" />

Pojo class of Layout:

public class ImageItem {
int imageID;
String header;
String description;

public ImageItem(int imageID, String header, String desc) {
    this.imageID = imageID;
    this.header = header;
    this.description = desc;

}

public int getImageID() {
    return imageID;
}

public String getHeader() {
    return header;
}

public String getDescription() {
    return description;
}
}

Any help will be most appreciated

FawwazFaisal
  • 57
  • 2
  • 11
  • You want to get `View` of a `ViewHolder` on click or by method like `getItemAt(position)`? – Jenea Vranceanu Jun 12 '20 at 14:18
  • I override the onPageScrolled method in the activity but don't know how to get the views of the layout Im adapting as recycler View So I need to return the view on onScroll event, I'm able to Toast the number of page in the viewPager2 with position param but don't know how to return the view of the layout – FawwazFaisal Jun 13 '20 at 14:19
  • I'll add an answer on how to get a view of a single list item from `RecyclerView`. – Jenea Vranceanu Jun 13 '20 at 15:08

1 Answers1

1

If there is a need to extract a view of a single item from a RecyclerView you can use a layout manager of your RecyclerView. Note, that you cannot extract views of items that are not visible on the screen.

Kotlin

val linearLayoutManager = recyclerView.layoutManager as LinearLayoutManager
val position = linearLayoutManager.findFirstVisibleItemPosition()
val view: View? = linearLayoutManager.getChildAt(position)

Java

LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int position = linearLayoutManager.findFirstVisibleItemPosition();
@Nullable
View view = linearLayoutManager.getChildAt(position);

If you need to do this while scrolling just set RecyclerView.OnScrollListener:

Kotlin

recyclerView.addOnScrollListener(object: RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        super.onScrolled(recyclerView, dx, dy)
        // Extract position and view here
    }
})

Java

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        // Extract position and view here
    }
})

You can get all visible items' views if you iterate from the first to the last visible position as there is also findLastVisibleItemPosition().

Jenea Vranceanu
  • 4,530
  • 2
  • 18
  • 34
  • Thank you for the answer. As I mentioned in the question title that I'm using ViewPager2, let me clarify that there is no RecyclerView used anywhere, but only the RecyclerView Adapter to adapt a layout that also doesn't have a Recycler View. The xml files are there in the question body, hope they are useful in understanding the problem – FawwazFaisal Jun 13 '20 at 21:25