简体   繁体   中英

How to getItemAt(position) when using Viewpager2 with RecyclerViewAdapter

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM