簡體   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