I want to create a widget that behaves similar to the gallery widget but scrolls vertically instead of horizontally. That is images in gallery should be vertically placed on screen and can be scroll vertically.Does anybody help me please?
-
possible duplicate of [Android: a vertical gallery?](http://stackoverflow.com/questions/2302880/android-a-vertical-gallery) – Paresh Mayani Mar 07 '12 at 06:18
3 Answers
Assume that you want to have a single column of images and want to scroll vertically. Check the following example
<GridView android:id="@+id/gridView1"
android:layout_width="70dp" android:layout_height="fill_parent"
android:verticalSpacing="2dp" android:numColumns="1"
android:stretchMode="columnWidth" android:layout_marginLeft="1dp"
android:layout_alignParentTop="true" android:scrollingCache="true"
android:scrollbars="vertical" android:fadeScrollbars="false"
android:scrollbarAlwaysDrawVerticalTrack="true">
</GridView>

- 444
- 4
- 13
I've managed to create a simple solution using a ListView
, and scrolling it to the closest position when the scroll is stopped. Simply create a ListView
and add this OnScrollListener
:
EDIT: I've updated the code to a better implementation
lv.setOnScrollListener(new OnScrollListener(){
private boolean handleScrollChange = true;
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
public void onScrollStateChanged(final AbsListView view, int scrollState) {
if (!handleScrollChange)
return;
if(scrollState == OnScrollListener.SCROLL_STATE_IDLE){
View centerView;
if (view.getLastVisiblePosition() - view.getFirstVisiblePosition() > 1) { //if shows more than 2 items, display the middle one
centerView = view.getChildAt( Math.round((view.getChildCount())/2));
}
else { //shows 2 items, check which one is closer to the middle
View bottomview = view.getChildAt(view.getChildCount()-1);
if (bottomview.getTop() < bottomview.getHeight() / 2) {
centerView = bottomview;
}
else {
centerView = view.getChildAt(0);
}
}
int wantedOffset = (view.getHeight() - centerView.getHeight()) / 2 ;
final int scrollby = (int) centerView.getY() - wantedOffset;
//we want to prevent the smoothScroll from calling this function again
handleScrollChange = false;
view.post(new Runnable() {
@Override
public void run() {
view.smoothScrollBy(scrollby,300);
view.postDelayed(new Runnable() {
@Override
public void run() {
handleScrollChange = true;
}
}, 1000);
}
});
}
}
});

- 1,472
- 2
- 11
- 18
You have to extend the Gallery class and in the Draw procedure rotate the canvas for 90 degrees. Then just a few adoptions like modifying the onTouch event and a few more is required. After this there will be a few problems with the layout (since it still wants to draw in the layout in its parameters). So I put it inside a LinearLayout and fixed the layout size in that.
So the final vertical gallery is actually a linear layout which has a gallery put inside it. I have implemented it, and it works quite well. You will only need to rotate everything you put in it for 90 degrees to the other direction. The trade off is really a little thus you can extend every view you want to put inside it and just rotate it to the other direction in the draw procedure.

- 341,306
- 83
- 791
- 678

- 552
- 3
- 17
-
1@Arnaud yes I have already implemented it. Turned out to be more complicated that I thought. I completed it for as much as I needed. You can continue the job. Please contact me to send you the class. – Yashar PourMohammad Mar 28 '12 at 06:50