Подтвердить что ты не робот

Android: HorizontalScrollView внутри ScrollView

У меня есть несколько HorizontalScrollViews внутри ScrollView. Горизонтальная прокрутка не совсем гладкая. Мне нужно прокручивать почти идеально горизонтально для прокрутки на работу. Есть ли простое исправление? Спасибо!

Multiple HorizontalScrollViews inside a single ScrollView

4b9b3361

Ответ 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 в вашем файле макета.