Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add Recyclerview in RecyclerViewPager

I added a Recyclerview in one item of RecyclerViewPager(https://github.com/lsjwzh/RecyclerViewPager). And I want to scroll the RecyclerView when I touch on it.

I have tried :

    View.OnTouchListener listener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_MOVE:
                case MotionEvent.ACTION_DOWN:
                    mRecyclerViewPager.requestDisallowInterceptTouchEvent(true);
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    mRecyclerViewPager.requestDisallowInterceptTouchEvent(false);
                    break;
            }
            return false;
        }
    };
    mRecyclerView.setOnTouchListener(listener);

But I can only scroll the RecyclerView sometimes.

I think it can be sloved by implementing NestedScrollingParent in RecyclerViewPager or changing onTouchEvent in RecyclerViewPager .But I'm not familiar with them.

enter image description here

like image 686
tiny sunlight Avatar asked Apr 13 '16 02:04

tiny sunlight


People also ask

What is ViewHolder in RecyclerView Android?

A ViewHolder describes an item view and metadata about its place within the RecyclerView. Adapter implementations should subclass ViewHolder and add fields for caching potentially expensive findViewById results. While LayoutParams belong to the LayoutManager , ViewHolders belong to the adapter.

What is RecyclerView adapter in android?

RecyclerView makes it easy to efficiently display large sets of data. You supply the data and define how each item looks, and the RecyclerView library dynamically creates the elements when they're needed. As the name implies, RecyclerView recycles those individual elements.


1 Answers

I followed the steps to configure and create the simple example using the Github documentation.

Main Activity XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.stackoverflow.recyclerviewstack.MainActivity">

    <com.lsjwzh.widget.recyclerviewpager.RecyclerViewPager
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="1dp"
        android:paddingRight="1dp"
        app:rvp_triggerOffset="0.1"
        app:rvp_singlePageFling="true"
        android:clipToPadding="false"
        />
</RelativeLayout>

Main Activiy class

package com.stackoverflow.recyclerviewstack;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;

import com.lsjwzh.widget.recyclerviewpager.RecyclerViewPager;

public class MainActivity extends AppCompatActivity {

    RecyclerAdapter mAdapter;
    RecyclerViewPager mRecycler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecycler = (RecyclerViewPager) findViewById(R.id.list);

        // setLayoutManager like normal RecyclerView, you do not need to change any thing.
        LinearLayoutManager layout = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        mRecycler.setLayoutManager(layout);

        //set adapter
        //You just need to implements ViewPageAdapter by yourself like a normal RecyclerView.Adpater.
        mAdapter = new RecyclerAdapter(ItemListGenerator.generateCollection(15, "OutItem "));
        mRecycler.setAdapter(mAdapter);
    }
}

RecyclerAdapter

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

    List<String> collection;

    public RecyclerAdapter(List<String> collection) {
        this.collection = collection;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView item;
        RecyclerView mInnerRecycler;

        public ViewHolder(View view) {
            super(view);
            item = (TextView) view.findViewById(R.id.title);
            mInnerRecycler = (RecyclerView) view.findViewById(R.id.innerRecycler);
            LinearLayoutManager layout = new LinearLayoutManager(view.getContext(),
                                                    LinearLayoutManager.HORIZONTAL, false);
            mInnerRecycler.setLayoutManager(layout);
            mInnerRecycler.setAdapter(new InnerAdapter());
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);

        View view = inflater.inflate(R.layout.outer_collection, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(position < 0 || position > getItemCount()) return;

        String itemString = collection.get(position);
        holder.item.setText(itemString);

    }

    @Override
    public int getItemCount() {
        return collection.size();
    }
}

the layout use by RecyclerViewPager to create ViewHolder

The ViewHolder use the layout outer_collection:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dip"
        android:layout_margin="2dip"
        android:background="@color/colorPrimary"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/innerRecycler"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

The InnerAdapter

public class InnerAdapter extends RecyclerView.Adapter<InnerAdapter.ViewHolder> {


    List<String> collection;

    public InnerAdapter() {
        this.collection = ItemListGenerator.generateCollection(15, "Inner ");
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView item;

        public ViewHolder(View itemView) {
            super(itemView);
            item = (TextView) itemView.findViewById(R.id.item);
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);

        View view = inflater.inflate(R.layout.simple_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(position < 0 || position > getItemCount()) return;
        holder.item.setText(collection.get(position));
    }

    @Override
    public int getItemCount() {
        return collection.size();
    }
}

Tip

For the RecyclerViewPager I used this orientation:

 LinearLayoutManager layout = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);

And for the RecyclerView inside this one:

LinearLayoutManager layout = new LinearLayoutManager(view.getContext(), LinearLayoutManager.HORIZONTAL, false);

If you use VERTICAL in the PagerView you can navigate in the horizontal collection or change to HORIZONTAL the PagerView orientation and you can scroll your inside items in the VERTICAL orientation.

You have to evaluate how do you want to use it. I hope this code help with your problem and also to rethink your design. Maybe is not a good practice or UX use the same orientation for both containers. I am not a UX expert.

I will like to be more helpful.

like image 174
Robert Avatar answered Sep 19 '22 09:09

Robert