Last active
April 6, 2023 17:20
-
-
Save sakurabird/6868765 to your computer and use it in GitHub Desktop.
AndroidのScrollViewの中のGridViewのlayout_heightが伸び縮みしないのを独自Viewで克服
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package xx.xxx.xx.view; | |
import android.content.Context; | |
import android.util.AttributeSet; | |
import android.view.ViewGroup; | |
import android.widget.GridView; | |
/** | |
* ScrollViewの中のGridViewでも高さを可変にする<br> | |
* http://stackoverflow.com/questions/8481844/gridview-height-gets-cut | |
*/ | |
public class ExpandableHeightGridView extends GridView | |
{ | |
boolean expanded = false; | |
public ExpandableHeightGridView(Context context) | |
{ | |
super(context); | |
} | |
public ExpandableHeightGridView(Context context, AttributeSet attrs) | |
{ | |
super(context, attrs); | |
} | |
public ExpandableHeightGridView(Context context, AttributeSet attrs, | |
int defStyle) | |
{ | |
super(context, attrs, defStyle); | |
} | |
public boolean isExpanded() | |
{ | |
return expanded; | |
} | |
@Override | |
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) | |
{ | |
// HACK! TAKE THAT ANDROID! | |
if (isExpanded()) | |
{ | |
// Calculate entire height by providing a very large height hint. | |
// View.MEASURED_SIZE_MASK represents the largest height possible. | |
int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, | |
MeasureSpec.AT_MOST); | |
super.onMeasure(widthMeasureSpec, expandSpec); | |
ViewGroup.LayoutParams params = getLayoutParams(); | |
params.height = getMeasuredHeight(); | |
} | |
else | |
{ | |
super.onMeasure(widthMeasureSpec, heightMeasureSpec); | |
} | |
} | |
public void setExpanded(boolean expanded) | |
{ | |
this.expanded = expanded; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<ScrollView | |
android:id="@+id/sc_spots" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:fillViewport="true" > | |
<xx.xxx.xx.view.ExpandableHeightGridView | |
android:id="@+id/spotsView" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_marginTop="15dp" | |
android:layout_marginBottom="15dp" | |
android:layout_marginLeft="5dp" | |
android:layout_marginRight="5dp" | |
android:horizontalSpacing="10dp" | |
android:isScrollContainer="false" | |
android:numColumns="5" | |
android:stretchMode="columnWidth" | |
android:verticalSpacing="10dp" /> | |
</ScrollView> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mGridView = (ExpandableHeightGridView) getView().findViewById(R.id.spotsView); | |
mGridView.setExpanded(true); | |
SpotsAdapter adapter = new SpotsAdapter(getActivity(), R.layout.spot_item,params); | |
mGridView.setAdapter(adapter); | |
adapter.notifyDataSetChanged(); |
I'm having trouble with this view on Kindle Fire. On my regular Android device, I can see the whole grid view, but on Kindle Fire, the bottom 5-10% gets clipped off, and I can't scroll further to see it all. I imagine this is a difference in screen measuring, but I don't know enough about it to figure out how to fix it. Any ideas?
I am getting null pointer exception :Attempt to invoke virtual method 'void ExpandableHeightGridView.setExpanded(boolean)' on a null object reference.
Please help.
any solution for onscroll change listener.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The problem is that You must set allways the LayoutParams as a parent of children is.
Example:
CardView inside LinearLayout should call setLayoutParams(new LinearLayout.LayoutParams(...))
Thats logic, right?
try to override function with instanceof, example :
if(getLayoutParams() != null) && (getLayoutParams() instanceof LinearLayoutParams) { ... }
I know this is most ugliest code, say thanx to private & final properties & methods of google team