Согласно тому, что я знаю, вы никогда не должны использовать HorizontalScrollView с ListView, так как ListView заботится о своей собственной прокрутке.Что наиболее важно, выполнение этого снимает все важные оптимизации в ListView для работы с большими списками, поскольку он фактически заставляет ListView отображать весь список элементов, чтобы заполнить бесконечный контейнер, предоставленный HorizontalScrollView.
http://developer.android.com/reference/android/widget/HorizontalScrollView.html
Поскольку вас могут заставить использовать двухмерный вид прокрутки, вы можете рассмотреть возможность использования этого: Интернет-архив blog.gorges.us/2010/06/android-two-dimensional-scrollview/
Я не использовал это, но это может быть разумным подходом.
Возможно, попробуйте, добавив это в свой XML-файл и в свой JAVA
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ScrollView
android:id="@+id/scrollVertical"
android:layout_width="wrap_content"
android:layout_height="match_parent" >
//WateverViewYouWant
</ScrollView>
</HorizontalScrollView>
И код onCreate / onCreateView
final HorizontalScrollView hScroll = (HorizontalScrollView) value.findViewById(R.id.scrollHorizontal);
final ScrollView vScroll = (ScrollView) value.findViewById(R.id.scrollVertical);
vScroll.setOnTouchListener(new View.OnTouchListener() { //inner scroll listener
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
});
hScroll.setOnTouchListener(new View.OnTouchListener() { //outer scroll listener
private float mx, my, curX, curY;
private boolean started = false;
@Override
public boolean onTouch(View v, MotionEvent event) {
curX = event.getX();
curY = event.getY();
int dx = (int) (mx - curX);
int dy = (int) (my - curY);
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
if (started) {
vScroll.scrollBy(0, dy);
hScroll.scrollBy(dx, 0);
} else {
started = true;
}
mx = curX;
my = curY;
break;
case MotionEvent.ACTION_UP:
vScroll.scrollBy(0, dy);
hScroll.scrollBy(dx, 0);
started = false;
break;
}
return true;
}
});