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
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()
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.