![](/img/trans.png)
[英]onResume() not called when using ViewPager2 and Fragment
[英]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.