I have a parent RecyclerView that contains another RecyclerView and a ViewPager2 as it's children. The ViewPager2 child is like a Tinder Card Stack that swipes left and right, and works perfectly fine independently (when it is not in parent RecyclerView). But inside the parent Recycler View, the ViewPager2 is not working as expected. I have tried getSwipeDirs() but it turns out it is not being called at all.
Here is my parent recyclerview and it's adapter
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);
}
}
RecyclerViewAdapter::
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);
}
}
}