У меня есть несколько HorizontalScrollViews внутри ScrollView. Горизонтальная прокрутка не совсем гладкая. Мне нужно прокручивать почти идеально горизонтально для прокрутки на работу. Есть ли простое исправление? Спасибо!
У меня есть несколько HorizontalScrollViews внутри ScrollView. Горизонтальная прокрутка не совсем гладкая. Мне нужно прокручивать почти идеально горизонтально для прокрутки на работу. Есть ли простое исправление? Спасибо!
Вы можете использовать представление Recycler с помощью диспетчера макетов Staggered
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.HORIZONTAL);
RecyclerViewAdapter recyclerViewAdapter = newRecyclerViewAdapter(this);
recyclerView.setAdapter(recyclerViewAdapter); //Don't miss to initialize your adapter
Этот класс создает 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;
}
}
Я нашел решение и все еще не могу поверить, что это то, что вам нужно сделать, чтобы сделать эту работу нормальной! Просто добавьте blank onClickListener к каждому элементу в HorizontalScrollView:
item.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
После этого слайд действительно гладкий, как вверх, так и вниз.
Если вы используете горизонтальное представление вида прокрутки (http://www.dev-smart.com/archives/34), решение проблемы перекрестной фокусировки между прокруткой view, а представление списка блокирует фокус в прокрутке, когда вы сосредоточитесь на просмотре списка.
С технической точки зрения вы должны добавить следующую строку в функцию onScroll
внутри класса HorizontalListView.
getParent().requestDisallowInterceptTouchEvent(true);
Надеюсь, что это поможет.
В общем, вы не должны использовать вложенные ScrollViews в Android вообще, поведение прокрутки таким образом тоже неестественно.
Возможно, вы захотите переосмыслить свой дизайн макета, не может ли это быть достигнуто с помощью расширяемого списка?
Пока Дэвид отвечает, у него есть недостаток. Он передает объект 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 в вашем файле макета.