Android: HorizontalScrollView внутри ScrollView
У меня есть несколько HorizontalScrollViews внутри ScrollView. Горизонтальная прокрутка не совсем гладкая. Мне нужно прокручивать почти идеально горизонтально для прокрутки на работу. Есть ли простое исправление? Спасибо!
![Multiple HorizontalScrollViews inside a single ScrollView]()
Ответы
Ответ 1
Вы можете использовать представление Recycler с помощью диспетчера макетов Staggered
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.HORIZONTAL);
RecyclerViewAdapter recyclerViewAdapter = newRecyclerViewAdapter(this);
recyclerView.setAdapter(recyclerViewAdapter); //Don't miss to initialize your adapter
Ответ 2
Этот класс создает ScrollView, содержащий HorizontalScrollView, объединенный в один класс. Вы можете поместить вещи внутрь, используя метод AddChild(). Функция dispatchTouchEvent overide сохраняет плавность прокрутки, поэтому вы можете перемещаться с помощью одного слайда пальца.
(Я недавно использовал это, чтобы обернуть программно созданный TextView)
class MultiScrollView extends ScrollView
{
public HorizontalScrollView hscroll;
public MultiScrollView ( Context context )
{
super( context );
}
public void AddChild( View child )
{
hscroll.addView( child );
}
@Override
public boolean dispatchTouchEvent( MotionEvent event )
{
hscroll.dispatchTouchEvent(event);
onTouchEvent(event);
return true;
}
}
Ответ 3
Я нашел решение и все еще не могу поверить, что это то, что вам нужно сделать, чтобы сделать эту работу нормальной! Просто добавьте blank onClickListener к каждому элементу в HorizontalScrollView:
item.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
После этого слайд действительно гладкий, как вверх, так и вниз.
Ответ 4
Если вы используете горизонтальное представление вида прокрутки (http://www.dev-smart.com/archives/34), решение проблемы перекрестной фокусировки между прокруткой view, а представление списка блокирует фокус в прокрутке, когда вы сосредоточитесь на просмотре списка.
С технической точки зрения вы должны добавить следующую строку в функцию onScroll
внутри класса HorizontalListView.
getParent().requestDisallowInterceptTouchEvent(true);
Надеюсь, что это поможет.
Ответ 5
В общем, вы не должны использовать вложенные ScrollViews в Android вообще, поведение прокрутки таким образом тоже неестественно.
Возможно, вы захотите переосмыслить свой дизайн макета, не может ли это быть достигнуто с помощью расширяемого списка?
Ответ 6
Пока Дэвид отвечает, у него есть недостаток. Он передает объект ScrollView MotionEvent прямо в HorizontalScrollView.onTouchEvent(), поэтому если HorizontalScrollView или его дети пытаются получить координаты событий, они получат неправильные координаты, которые основаны на ScrollView.
Мое решение:
public class CustomScrollView extends ScrollView{
/*************skip initialization*************/
@Override
public boolean onInterceptTouchEvent(MotionEvent e){
//returning false means ScrollView is not interested at any events,
//so ScrollView onTouchEvent() won't be called,
//and all of the events will be passed to ScrollView child
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//manually call ScrollView onTouchEvent(),
//the vertical scrolling happens there.
onTouchEvent(ev);
//dispatch the event,
//ScrollView child will have every event.
return super.dispatchTouchEvent(ev);
}
}
Просто оберните этот CustomScrollView вокруг HorizontalScrollView в вашем файле макета.