首页 > 解决方案 > 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);
    }
}

}

标签: androidandroid-recyclerviewandroid-viewpager2nestedrecyclerview

解决方案


我找到了这个解决方案,希望它对你有用

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

推荐阅读