Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the height of recyclerview item in "onBindViewHolder"

The height of RecyclerView item is not fixed,i need to set the background image for every item,so I want to get the height of recyclerview's item to resize the Image,but the itemView.getHeight() always return 0 in onBindViewHolder.

I have try to search many questions or articles,but i still cant get a good soluation.

like image 433
zys Avatar asked Aug 04 '16 10:08

zys


People also ask

How do I change the size of the RecyclerView?

If you just want your recycler view to size automatically as per number of items then, why don't you put RecyclerView height as wrap_content. If you have multiple ScrollView in layout then try wrapping RecyclerView in NestScrollView and set it's height as wrap_content too.

What is ViewHolder in RecyclerView?

A ViewHolder describes an item view and metadata about its place within the RecyclerView. RecyclerView. Adapter implementations should subclass ViewHolder and add fields for caching potentially expensive View. findViewById(int) results.


2 Answers

Short

Measure the View manually

view.measure(              View.MeasureSpec.makeMeasureSpec(recyclerViewWidth, View.MeasureSpec.EXACTLY),              View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 

and get the height with view.getMeasuredHeight()

Background

A view will return a valid value for View.getHeight()only after it has been measured. The measuring itself will automatically happen by the system when the view is about to be displayed on screen.

When Android wants to display the layout, it will recursively call the view.layout() function for each view in the view tree. Each Parent tells its children the constraints they might have (width/height) and ask them to view.measure() themselves. As a result, the view will store the measured values BASED on the constraints in designated members (MeasuredHeight/Width). Note that at this point view.getMeasuredHeight() will hold the value while view.getHeight() will still be invalid. view.getHeight() will only return a valid value once the view has an actual height in the UI hierarchy.

Recap

So, to know the height of a view element, before it has been measured and laid out by the system, we will need to invoke the view.measure() function manually.

The measure function expects 2 parameters which derived from the view LayoutParams + the parent constraints.

In the above code sample, we are measuring the view forcing its width to be EXACTLY the width of the parent (the RecycleView), and the height is not limited.

like image 133
Eyal Biran Avatar answered Sep 29 '22 20:09

Eyal Biran


I suggest that you define multiple layout files with the expected heights and inflate them according to some criteria in your data set.

ViewHolder onCreateViewHolder (ViewGroup parent, int viewType){   if(some condition){     //inflate layout 1   }else{     //inflate layout 2  } 

or as answered here: you can get the measurements while initializing the view holder

itemView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); int width = itemView.getMeasuredWidth(); int height = itemView.getMeasuredHeight(); 
like image 33
Mina Wissa Avatar answered Sep 29 '22 20:09

Mina Wissa