16

我在 ScrollView 中有多个Horizo ​​ntalScrollViews。水平滚动一点也不流畅。我必须几乎完美地水平滚动才能滚动工作。有一个简单的解决方法来调整这个???谢谢!

单个 ScrollView 内的多个 Horizo​​ntalScrollViews

4

6 回答 6

8

您可以将 Recycler 视图与交错布局管理器一起使用

 StaggeredGridLayoutManager  staggeredGridLayoutManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.HORIZONTAL);

 RecyclerViewAdapter recyclerViewAdapter = newRecyclerViewAdapter(this);

 recyclerView.setAdapter(recyclerViewAdapter); //Don't miss to initialize your adapter
于 2012-10-23T00:25:12.300 回答
4

此类创建一个 ScrollView,其中包含一个合并为一个类的 Horizo​​ntalScrollView。您可以使用 AddChild() 方法将内容放入其中。dispatchTouchEvent 覆盖保持滚动平滑,因此您可以用手指的单次滑动来平移。

(我最近用它来包装一个以编程方式创建的 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;
 }
}
于 2012-10-15T11:48:54.153 回答
2

如果您使用来自 ( http://www.dev-smart.com/archives/34 ) 的水平滚动视图解决方案,则滚动视图列表视图之间的交叉焦点问题的解决方案会阻止滚动视图的焦点一旦您专注于列表视图。

从技术角度来看,您应该将以下行添加到onScrollHorizo​​ntalListView 类内的函数中。

getParent().requestDisallowInterceptTouchEvent(true);

希望这可以帮助。

于 2013-05-08T13:55:00.720 回答
1

我找到了解决方案,但仍然无法相信这是您必须做的才能使这项工作正常进行!刚刚将空白 onClickListener添加到 Horizo ​​ntalScrollView中的每个项目:

    item.setOnClickListener(new OnClickListener() {         
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
        }
    });

之后这张幻灯片真的很顺利,无论是向上还是向下。

于 2012-08-23T10:04:12.113 回答
0

一般来说,您根本不应该在 Android 中使用嵌套的 ScrollView,以这种方式滚动的行为也是不自然的。

您可能想重新考虑您的布局设计,这是可扩展列表无法实现的吗?

于 2012-08-22T14:38:17.660 回答
0

虽然大卫的答案有效,但它有一个缺点。它将ScrollView 的MotionEvent 对象直接传递给Horizo​​ntalScrollView.onTouchEvent(),因此如果Horizo​​ntalScrollView 或其子级试图获取事件坐标,他们将得到基于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's onTouchEvent() won't be called,
        //and all of the events will be passed to ScrollView's child
        return false;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        //manually call ScrollView's onTouchEvent(),
        //the vertical scrolling happens there.
        onTouchEvent(ev);
        //dispatch the event,
        //ScrollView's child will have every event.
        return super.dispatchTouchEvent(ev);
    }
}

只需将此 CustomScrollView 包裹在布局文件中的 Horizo​​ntalScrollView 上。

于 2017-04-13T11:43:06.817 回答