![](/img/trans.png)
[英]HorizontalScrollView inside ScrollView - disable vertical scroll when horizontal scroll is in progress
[英]HorizontalScrollView inside ListView: minor vertical scroll stops horizontal scroll
在我的示例活动中,我有
-包含的ListView
-包含多个HorizontalScrollView
-一组TextView
但是,水平滚动体验却很糟糕。
当我启动水平滚动(或猛扑)时,必须非常小心以使其起作用。
一旦水平滚动包含一个(小的)垂直组件,垂直ListView滚动将接管并完全停止水平滚动。
关于如何改善这一点的任何建议?
提前致谢,
渣
import android.app.Activity;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class Test extends Activity
{
private final static int N = 20;//number of HorizontalScrollView
private final static int M = 20;//number of TextViews inside a single HorizontalScrollView
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
//create a list of HorizontalScrollViews
final HorizontalScrollView[] hors = new HorizontalScrollView[N];
for (int i = 0; i < hors.length; i++)
{
hors[i] = new HorizontalScrollView(this, null);
hors[i].setMinimumHeight(60);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.HORIZONTAL);
hors[i].addView(ll);
for (int j = 0; j < M; j++)
{
TextView t = new TextView(Test.this);
t.setText("HorizontalScrollView: "+i+"; TextView: "+j);
t.setMinimumHeight(40);
ll.addView(t);
}
}
//add a ListView
ListView list = new ListView(this);
layout.addView(list);
list.setAdapter(new BaseAdapter()
{
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
return hors[position];
}
@Override
public long getItemId(int position)
{
return 0;
}
@Override
public Object getItem(int position)
{
return hors[position];
}
@Override
public int getCount()
{
return N;
}
});
setContentView(layout);
}
}
问题在于ListView
(或其父AbsListView
)实现了onInterceptTouchEvent
,因此ListView
认为可以更好地处理它们时,就可以拦截所有触摸事件。
可以通过调用requestDisallowInterceptTouchEvent
来避免这种情况,例如,通过将HorizontalScrollView
子类化并在其dispatchTouchEvent
:
public boolean dispatchTouchEvent(MotionEvent ev)
{
boolean ret = super.dispatchTouchEvent(ev);
if(ret)
{
requestDisallowInterceptTouchEvent(true);
}
return ret;
}
它需要一些改进(例如,如果水平分量大于垂直分量,则仅调用requestDisallowInterceptTouchEvent
),因为现在几乎不再允许ListView
进行控制。
虽然我没有在代码中进行挖掘,但是人们通常会犯的错误是在ScrollView中插入listView。
由于listview是自动滚动的,因此请将其保留在scrollView之外,而其他内容可能在scrollView中。
检查是否是这种情况,否则共享XML布局
Android有一个称为触摸倾斜的概念。 这是一个已经回答的类似问题: Android ACTION_MOVE阈值
最好的方法。
将给定的代码放到您的水平listview onScroll方法上就可以了
ViewParent view_parent = getParent();
if (view_parent != null)
{
view_parent.requestDisallowInterceptTouchEvent(true);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.