Grid of images inside ScrollView
Oh boy, yeah, you're gonna have trouble with this one. It drives me nuts that ListViews and GridViews can't be expanded to wrap their children, because we all know that they have more beneficial features in addition to their scrolling and the recycling of their children.
Nonetheless, you can hack around this or create your own layout to suit your needs without too much difficulty. Off the top of my head, I can think of two possibilities:
In my own app I have embedded a ListView within a ScrollView. I have done this by explicitly telling the ListView to be exactly as high as its contents. I do it by changing the layout parameters right inside the ListView.onMeasure()
method like so:
public class ExpandableListView extends ListView {
boolean expanded = false;
public ExpandableListView(Context context, AttributeSet attrs, int defaultStyle) {
super(context, attrs, defaultStyle);
}
public boolean isExpanded() {
return expanded;
}
public void setExpanded(boolean expanded) {
this.expanded = 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);
LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}
This works because when you give the ListView a mode of AT_MOST
, it creates and measures all of its children for you, right inside the onMeasure
method (I discovered this by browsing through the source code). Hopefully GridView behaves the same, but if it doesn't, you can still measure all the contents of the GridView yourself. But it would be easier if you could trick the GridView into doing it for you.
Now, you must keep in mind that this solution would completely disable the view recycling that makes GridView so efficient, and all those ImageViews will be in memory even if they're not visible. Same goes with my next solution.
The other possibility is to ditch the GridView and create your own layout. You could extend either AbsoluteLayout
or RelativeLayout
. For example, if you extend RelativeLayout
, you could place each image LEFT_OF
the previous one, keeping track of the width of each image until you run out of room on that row, and then start the next row by placing the first image of the new row BELOW
the tallest image of the last row. To get the images horizontally centered or in equally-spaced columns you'll have to go through even more pain. Maybe AbsoluteLayout is better. Either way, kind of a pain.
Good luck.
How to put GridView inside ScrollView
There are definitely benefits to a GridView beside the inherent scrolling. For example, a consistent, dynamic layout of cells that will expand and contract based on the data you pass into it. So, when people say it's not good to desire such a functionality, I think that's wrong because you could want the dynamic grid of images (views) inside of a scrolling view, but want that entire scrolling view to contain other things than just the grid cells.
Now, here is how you can do this. Check the answer here. It is an expandable height GridView, which you will want to import / create in your project. What that basically means is that as more items are added to the GridView, it will just expand its height, as opposed to keeping its height set and using scrolling. This is exactly what you want.
Once you have the ExpandableHeightGridView in your project, go to your XML layout where you want the GridView to be. You can then do something like this (paraphrasing):
<ScrollView ...>
<RelativeLayout ...>
<com.example.ExpandableHeightGridView ... />
<other view items />
</RelativeLayout>
</ScrollView>
Then, in your activity where you set the GridView's adapter, you want to make sure you set it to expand. So:
ExpandableHeightGridView gridView = (ExpandableHeightGridView) findViewById(R.id.myId);
gridView.setAdapter(yourAdapter);
gridView.setExpanded(true);
The reason you want this expandable GridView is because, the fact that a standard GridView doesn't expand is what causes it to scroll. It sticks to a certain height, and then as more items fill it past its view bounds, it becomes scrollable. Now, with this, your GridView will always expand its height to fit the content within it, thus never allowing it to enter its scrolling mode. This enables you to use it inside of the ScrollView and use other view elements above or below it within the ScrollView, and have them all scroll.
This should give you the result you're looking for. Let me know if you have any questions.
Android: Two images inside a scroll view
You cant add more than on child to a ScrollView (or HorizontalScrolView).
You can fix it with a child layout to have both elements.
<ScrollView
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:id="@+id/scrollView"
android:layout_alignParentBottom="true"
android:layout_alignParentTop="true">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:adjustViewBounds="true"
android:layout_weight="1"
android:gravity="center"
android:scaleType="fitXY"
android:src="@drawable/ic_ntm"
android:id="@+id/imageView15" />
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:adjustViewBounds="true"
android:gravity="center"
android:scaleType="fitXY"
android:layout_weight="1"
android:src="@drawable/ic_ntm"
android:id="@+id/imageView17"
android:layout_marginTop="44dp" />
</LinearLayout>
</ScrollView>
Also note the android:layout_weight="1", so each ImageView can take half of the view, cause if both are fill_parent only the first will show.
How to show image in Scrollable GridLayout in Kivy
Try disabling the size_hint
(the y part at least) for your Image:size_hint_y: None
You'll probably need to define a size , also.
size_hint
doesn't seem to work (even the default 1, 1) but, since I haven't worked with a GridLayout
, this might be the normal behavior.
How to show multiple images inside UIScrollView in iOS
An example from danielbeard.wordpress.com
In case your image names aren't just numbers:
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[scrollView setPagingEnabled:YES];
[scrollView setAlwaysBounceVertical:NO];
NSArray *imagesArray = [NSArray arrayWithObjects:@"img1.png", @"img2.png", @"img3.png", nil];
for (int i = 0; i < [imagesArray count]; i++)
{
CGFloat xOrigin = i * scrollView.frame.size.width;
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(xOrigin, 0, scrollView.frame.size.width, scrollView.frame.size.height)];
[imageView setImage:[UIImage imageNamed:[imagesArray objectAtIndex:i]]];
[imageView setContentMode:UIViewContentModeScaleAspectFit];
[scrollView addSubview:imageView];
}
[scrollView setContentSize:CGSizeMake(scrollView.frame.size.width * [imagesArray count], scrollView.frame.size.height)];
Issue with Grid height, inside a ScrollView
So, I mange to make it work !
After a change on my editor, I check the height of each Editor in each row, and define my grid height with this value (and adding the row spacing of course).
So, my grid as a fixed height (recalculated), and so my scrollview is scrollable, and nothing is truncated !
If it can help someone else :)
Related Topics
Calling Startactivity() from Outside of an Activity Context
How to Mock Location on Device
How to Create a Listview with Rounded Corners in Android
How to Set Different Label for Launcher Rather Than Activity Title
How to Implement Drawerarrowtoggle from Android Appcompat V7 21 Library
Webview: How to Avoid Security Alert from Google Play Upon Implementation of Onreceivedsslerror
Convert a PDF Page into Bitmap in Android Java
How to Change the Text Color of Menu Item in Android
Android Listview Not Refreshing After Notifydatasetchanged
How to Execute Async Task Repeatedly After Fixed Time Intervals
How Does One Use Glide to Download an Image into a Bitmap
Android. How Does Notifydatasetchanged() Method and Listviews Work
What Does Google-Services.JSON Really Do
How to Access the Drawable Resources by Name in Android