繁体   English   中英

将 Viewpager2 与 RecyclerViewAdapter 一起使用时如何 getItemAt(position)

[英]How to getItemAt(position) when using Viewpager2 with RecyclerViewAdapter

我通过将它设置为 recyclerView 适配器实现了一个非常棒的 viewpager2,但我需要的不仅仅是滚动它。

我想要的是:

我需要获取使用 RecyclerView.Adapter 调整的布局内的视图。 listView.setOnItemClickListener 的工作方式类似(使用 AdapterView.OnItemClickListener())

到目前为止我所做的

我的活动代码:

    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);
    }

适配器代码:

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());
    }
}
}

我要检索其视图的布局:

<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 布局:

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;
}
}

任何帮助将不胜感激

如果需要从RecyclerView中提取单个项目的视图,您可以使用RecyclerView的布局管理器。 请注意,您无法提取屏幕上不可见的项目的视图。

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);

如果您需要在滚动时执行此操作,只需设置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
    }
})

如果您从第一个到最后一个可见 position 迭代,您可以获得所有可见项目的视图,因为还有findLastVisibleItemPosition()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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