Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ListView内部的水平滚动视图:次要垂直滚动停止水平滚动_Android_Android Layout - Fatal编程技术网

Android ListView内部的水平滚动视图:次要垂直滚动停止水平滚动

Android ListView内部的水平滚动视图:次要垂直滚动停止水平滚动,android,android-layout,Android,Android Layout,在我的示例活动中,我有 -包含 -包含 -一组文本视图 不过,水平滚动的体验相当糟糕。 当我开始水平滚动(或投掷)时,我必须非常小心地使其工作 一旦水平滚动包含(小的)垂直组件,垂直ListView滚动就会接管并完全停止水平滚动 有没有关于如何改进的建议 提前感谢, 马克 导入android.app.Activity; 导入android.database.DataSetObserver; 导入android.os.Bundle; 导入android.view.view; 导入android.v

在我的示例活动中,我有
-包含
-包含
-一组文本视图

不过,水平滚动的体验相当糟糕。
当我开始水平滚动(或投掷)时,我必须非常小心地使其工作

一旦水平滚动包含(小的)垂直组件,垂直ListView滚动就会接管并完全停止水平滚动

有没有关于如何改进的建议

提前感谢,

马克

导入android.app.Activity;
导入android.database.DataSetObserver;
导入android.os.Bundle;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.HorizontalScrollView;
导入android.widget.LinearLayout;
导入android.widget.ListAdapter;
导入android.widget.ListView;
导入android.widget.RelativeLayout;
导入android.widget.TextView;
公共类测试扩展了活动
{
私有最终静态int N=20;//水平滚动视图的数目
private final static int M=20;//单个HorizontalScrollView中的文本视图数
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
LinearLayout布局=新的LinearLayout(本);
//创建水平滚动视图列表
最终水平滚动视图[]hors=新水平滚动视图[N];
对于(int i=0;i
虽然我并没有深入挖掘您的代码,但人们通常犯的错误是在ScrollView中插入listView

由于listview是自动滚动的,所以当其他内容可能在scrollView中时,请将其保留在scrollView之外


检查是否是这种情况,否则共享XML布局

问题在于
列表视图
(或者更确切地说,它的父级
AbsListView
)实现了
对InterceptTouchEvent
,因此
列表视图
可以在认为它处于更好的处理位置时立即拦截所有触摸事件

这可以通过调用
requestDisallowWinterCeptTouchEvent
来避免,例如通过对
HorizontalScrollView
及其
dispatchTouchEvent
进行子类化:

public boolean dispatchTouchEvent(MotionEvent ev)
{
  boolean ret = super.dispatchTouchEvent(ev);
  if(ret) 
  {
    requestDisallowInterceptTouchEvent(true);
  }
  return ret;
}       

它需要一些改进(例如,如果水平组件大于垂直组件,则只调用call
requestdisallowenterceptouchevent
),因为现在它几乎不允许
列表视图
控制

Android有一个叫做触摸屏的概念。这里已经回答了一个类似的问题:

最好的方法

将给定的代码放在水平listview onScroll方法上,使其工作正常

   ViewParent view_parent = getParent();
   if (view_parent != null) 
   {
     view_parent.requestDisallowInterceptTouchEvent(true);
   }

My ListView是父组件,HorizontalScrollView是ListView的子组件(因此它似乎与您的场景相反)。我没有使用XML布局;所有视图都是在代码中创建的。我想我可以将问题重新表述为“子视图是否可能接收ListView父视图使用的TouchEvents”。这将允许ListView处理移动的垂直部分,而HorizontalScrollView可以处理移动的水平部分。我认为mTouchSlop在这里不相关。最初的问题是一个小的垂直滚动会停止水平滚动,因为此时ListView正在接管。
   ViewParent view_parent = getParent();
   if (view_parent != null) 
   {
     view_parent.requestDisallowInterceptTouchEvent(true);
   }