Use RecyclerView inside ScrollView with flexible Recycler item height

39,331

Solution 1

I search for answer this question all over the world but I didn't found any direct answer for this popular question. At last I mixed some trick together and solved this problem!

My problem start when my boss asked me to use a RecyclerView inside a ScrollView, and as you know we cannot use two Scrollable objects inside each other except when we set or know fix item height for our RecyclerView. and this is the answer:

Step 1: at first you should find your RecyclerView flexible item height and this is possible from your RecyclerView>onBindViewHolder

holder.itemView.post(new Runnable() {
        @Override
        public void run() {

            int cellWidth = holder.itemView.getWidth();// this will give you cell width dynamically
            int cellHeight = holder.itemView.getHeight();// this will give you cell height dynamically

            dynamicHeight.HeightChange(position, cellHeight); //call your iterface hear
        }
    });

with this code you find your item height as them build and send the item height to your activity with interface.

for those friend who have problem with interface i leave interface code below that should write in Adapter.

public interface DynamicHeight {
    void HeightChange (int position, int height);
}

Step 2: we found our item height so far and now we want to set height to our RecyclerView. first we should calculate the Summation of item height. in this step we do this by BitMap first implements last step interface and write these code below inside your Activity or Fragment that define your RecyclerView:

@Override
public void HeightChange(int position, int height) {
    itemHeight.put(position, height);
    sumHeight = SumHashItem (itemHeight);

    float density = activity.getResources().getDisplayMetrics().density;
    float viewHeight = sumHeight * density;
    review_recyclerView.getLayoutParams().height = (int) sumHeight;

    int i = review_recyclerView.getLayoutParams().height;
}

int SumHashItem (HashMap<Integer, Integer> hashMap) {
    int sum = 0;

    for(Map.Entry<Integer, Integer> myItem: hashMap.entrySet())  {
        sum += myItem.getValue();
    }

    return sum;
}

Step 3: now we have the summation of your RecyclerView height. for last step we should just send the Interface that we write in last step to adapter with some code like this:

reviewRecyclerAdapter = new ReviewRecyclerAdapter(activity, reviewList, review_recyclerView, this);

when you implement interface, you should send it to your with your context that I use this.

Enjoy it

Solution 2

If you want to just scrolling then you can use to NestedScrollView instead of ScrollView So you can modify your code with following :

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

            //design your content here with RecyclerView 

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>

Solution 3

Use This line to your recyclerview :

 android:nestedScrollingEnabled="false"

try it ,recyclerview will be smoothly scrolled with flexible height

Solution 4

[RESOLVED] I have same issue with Horizontal recycleview. Change Gradle repo for recycleview

 compile 'com.android.support:recyclerview-v7:23.2.1'

Write this: linearLayoutManager.setAutoMeasureEnabled(true);

Fixed bugs related to various measure-spec methods in update

Check http://developer.android.com/intl/es/tools/support-library/features.html#v7-recyclerview

I have found issue with 23.2.1 library: When item is match_parent recycle view fill full item to view, please always go with min height or "wrap_content".

Thanks

Solution 5

To fix fling in RecyclerView you must override canScrollVertically in LinearLayoutManager:

linearLayoutManager = new LinearLayoutManager(context) {
 @Override
 public boolean canScrollVertically() {
  return false;
 }
};
Share:
39,331
Ashkan
Author by

Ashkan

Updated on July 17, 2022

Comments

  • Ashkan
    Ashkan almost 2 years

    I want to know if there is any possible way to use RecyclerView?

    Before this, I used RecyclerView with fixed height inside a ScrollView but this time I don't know the height of the item.

    Hint: I read all question and solution on stack question before asking this question.

    update: Some solution show how to scroll RecyclerView on its own but I want to show it expanded.

  • Ashkan
    Ashkan over 8 years
    I didn't test it yet, but I think your code want to scroll RecyclerView on it own. I will try it today. tnx dear friend
  • Ashkan
    Ashkan over 8 years
    i didn't help, as I said before it help to scroll RecyclerView on it own with fix height. it's not my goal.
  • H Raval
    H Raval over 8 years
    i cant figur it out...getting some errors..can you please provide full example with adapter class and recyclerview implementation
  • Ashkan
    Ashkan over 8 years
    @HetalUpadhyay which part you have Error? this week i have not enough time to do this. but if you are not in hUrry I will do it for you
  • H Raval
    H Raval over 8 years
    actually i am not getting any error but when i tried same code with horizontal recycler view it display nothing...so it will be grateful to you if you can provide a code that work fine in both case horizontal and vertical scrolling
  • Ashkan
    Ashkan over 8 years
    @HetalUpadhyay may you explain what do you want to do? because I have some code to calculate how many item should be in a horizontal form with fix width
  • Ashkan
    Ashkan over 8 years
    @HetalUpadhyay ok, got it. I try to do it on friday. send me an email: [email protected]
  • H Raval
    H Raval over 8 years
    sorry i forgot to mention that i am using GridLayoutManager not Linear
  • H Raval
    H Raval over 8 years
    thanx...worked perfectly for me just added android:fillViewport="true" to scrollview and it start working
  • hornet2319
    hornet2319 almost 8 years
    seems like variable viewHeight is never used
  • JustADev
    JustADev over 6 years
    To add to this answer, you also need to use NestedScrollView this answer alone didn't work on Android 7+ :\
  • careful7j
    careful7j about 6 years
    NestedScrollView instead of ScrollView solved my issue, thanks!
  • Adam
    Adam almost 6 years
    This should be the accepted answer. No ConstraintLayout, no custom subclasses. This just works as intended.
  • Adam
    Adam almost 6 years
    This is far more complicated than is necessary.Look at @Bhunnu Baba's answer.
  • Ewoks
    Ewoks almost 6 years
    just for records, it is available from API 21