Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Non Scroll RecyclerView scrolling issue in Android SDK 23

I am implementing a RecyclerView inside a ScrollView. In order to have only one scrolling behaviour on the entire page I implement a NonScrollRecyclerView version. The implementation is as follows:

public class NonScrollRecyclerView extends RecyclerView {
    public NonScrollRecyclerView(Context context) { super(context); }

    public NonScrollRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public NonScrollRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev){

        if(ev.getAction() == MotionEvent.ACTION_MOVE)
            return true;

        return super.dispatchTouchEvent(ev);
    }
}

Once i update my build and target settings to SDK 23, I have trouble scrolling the page which contains the NonScrollRecyclerView. The specific problem is that the page scrolls OK until i reach the recycler view portion and once i scroll onto this view I am unable to scroll anymore, either up or down.

I DONOT face this problem with SDK 22 and below

My xml is as follows:

XML @layout/rv contains the recycler view

<ScrollView 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"
  android:background="@color/background_gray">

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/background_gray"
    android:orientation="vertical">

    <include
        layout="@layout/row_mall_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/cv_mall_header"
        android:layout_marginTop="8dp"/>

    <include
        layout="@layout/row_mall_shops"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/cv_mall_shops"
        android:layout_marginTop="8dp"/>

    <include
        layout="@layout/row_mall_coupons"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/cv_mall_coupons"
        android:layout_marginTop="8dp"/>

    <include
        layout="@layout/rv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/cv_mall_feeds"
        android:layout_marginTop="8dp"/>

  </LinearLayout>
</ScrollView>

XML - @layout/rv

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical" android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@color/background_gray"
  android:id="@+id/ll_mall_feeds">

 <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:paddingTop="6dp"
    android:paddingBottom="6dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_feedcount"
        android:textColor="@color/semi_theme_blue"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="12dp"
        android:layout_centerVertical="true" />

 </RelativeLayout>

 <com.project.ui.NonScrollRecyclerView
     android:id="@+id/nrv"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:divider="@android:color/transparent"
     android:listSelector="@android:color/transparent" />

</LinearLayout>
like image 391
stud91 Avatar asked Oct 18 '22 21:10

stud91


1 Answers

RecyclerView and ListView are not recommended inside a ScrollView because elements hights are not calculated when rendering the ScrollView. This means, your adapter might not be populated when the ScrollView is shown and later when the RecyclerView is notified about data changes (for instance when you initialize your adapter), there's not way to recalculate the elements heights.

It's really a pain in the neck because you have to try to calculate the elements heights and it's never accurate, so you will have discrepancies when showing a ListView or a RecyclerView inside a ScrollView. Some examples of how to calculate the elements heights can be checked here and here.

My advice is to turn your RecyclerView into a LinearLayout and add elements programmatically, so you emulates the ListView or RecyclerView behaviour:

LinearLayout layout = (LinearLayout) rootView.findViewById(R.id.files);
layout.removeAllViews();

for (int i = 0; i < fileAdapter.getCount(); i++) {
    final View item = fileAdapter.getView(i, null, null);
item.setClickable(true);

    item.setId(i);

    item.setOnClickListener(new View.OnClickListener() {
        @Override
            public void onClick(View v) {

                fileContentRowPosition = v.getId();

        # Your click action here


    }
});


layout.addView(item);

}

Here its the XML with the files definition:

<ScrollView
    android:id="@+id/scrollView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

...

    <LinearLayout
        android:id="@+id/files"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:orientation="vertical">
    </LinearLayout>


</ScrollView>

The whole java code can be checked here and the whole Layout here.

On the other hand, if you still want to continue with your implementation, and regarding your issue, you can check this article about Handling Scrollable Controls in Scrollview

Best regards,

like image 69
lgallard Avatar answered Oct 22 '22 00:10

lgallard