android - ViewPager2 滑动在 RecyclerView 中不起作用
问题描述
我有一个父 RecyclerView 包含另一个 RecyclerView 和一个 ViewPager2 作为它的孩子。ViewPager2 child 就像一个 Tinder Card Stack,可以左右滑动,并且可以独立工作(当它不在父 RecyclerView 中时)。但是在父 Recycler View 中,ViewPager2 没有按预期工作。我试过 getSwipeDirs() 但事实证明它根本没有被调用。
这是我的父母 recyclerview 和它的适配器
public class MainView extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_view);
initRecyclerView();
}
private void initRecyclerView() {
LinearLayoutManager layoutManager = new LinearLayoutManager(this,
LinearLayoutManager.HORIZONTAL, false);
RecyclerView rv = (RecyclerView) findViewById(R.id.rv_parent);
rv.setLayoutManager(layoutManager);
PagerSnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(rv);
MainViewAdapter adapter = new MainViewAdapter();
rv.setAdapter(adapter);
ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new ItemTouchHelper.SimpleCallback(0, 0) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
@Override
public int getSwipeDirs(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
if (viewHolder instanceof MainViewAdapter.ViewHolderOne) {
return 0;
}
return super.getSwipeDirs(recyclerView, viewHolder);
}
};
ItemTouchHelper itemTouchHelper1 = new ItemTouchHelper(itemTouchHelperCallback);
itemTouchHelper1.attachToRecyclerView(rv);
}
}
回收器视图适配器::
class MainViewAdapter extends RecyclerView.Adapter {
private Context context;
@Override
public int getItemViewType(int position) {
if (position%2 == 0) {
return 0;
}
return 1;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
context = parent.getContext();
View view;
if (viewType == 0) {
view = layoutInflater.inflate(R.layout.activity_card_stack, parent, false);
return new ViewHolderOne(view);
}
view = layoutInflater.inflate(R.layout.activity_timeline_rv, parent, false);
return new ViewHolderTwo(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position%2==0) {
ViewHolderOne viewHolderOne = (ViewHolderOne) holder;
CardStackAdapter cardStackAdapter = new CardStackAdapter((FragmentActivity)context);
viewHolderOne.cardStackVP.setAdapter(cardStackAdapter);
viewHolderOne.cardStackVP.setOffscreenPageLimit(5);
viewHolderOne.cardStackVP.setPageTransformer(new CardStackTransformer());
}
else {
ViewHolderTwo viewHolderTwo = (ViewHolderTwo) holder;
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
PagerSnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(viewHolderTwo.timeline_rv);
viewHolderTwo.timeline_rv.setLayoutManager(layoutManager);
viewHolderTwo.timeline_rv.setAdapter(new TimelineRVAdapter());
}
}
@Override
public int getItemCount() {
return 5;
}
class ViewHolderOne extends RecyclerView.ViewHolder {
ViewPager2 cardStackVP;
public ViewHolderOne(@NonNull View itemView) {
super(itemView);
cardStackVP = (ViewPager2)itemView.findViewById(R.id.cardViewPager0);
}
}
class ViewHolderTwo extends RecyclerView.ViewHolder {
RecyclerView timeline_rv;
public ViewHolderTwo(@NonNull View itemView) {
super(itemView);
timeline_rv = (RecyclerView) itemView.findViewById(R.id.timeline_rv);
}
}
}
解决方案
我找到了这个解决方案,希望它对你有用
<NestedScrollableHost
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" />
</NestedScrollableHost>
推荐阅读
- java - 为什么 vm JAVA_OPTIONS 在码头不起作用
- swift - swift - '(AnyObject)' 不是 'NSObject' 的子类型
- reactjs - 如何在我的 reactjs 应用程序中更改样式字体以为 agGridReact 组件?
- javascript - Quasar SSR:使用引导文件将 HTML 内容注入 index.html
- python - 将两列与 None 进行比较,其中一列中的 None 与另一列的计数不同
- sql - 在不影响代码的情况下转换表格设计
- php - 如何使用 preg_match 和 preg_replace 在带有破折号的字符串中添加和附加任何数字组?
- linux - 在 nginx 上提供外部文件
- if-statement - 用累积计数替换单元格
- ruby-on-rails - Bootstrap 徽章颜色在 Rails 中不起作用