HorizontalScrollView里面的ListView:轻微垂直滚动停止水平滚动 [英] HorizontalScrollView inside ListView: minor vertical scroll stops horizontal scroll
问题描述
在我的例子活动,我已经
- 一个ListView包含
- 多HorizontalScrollView含
- 一组的TextView的
水平滚动的经验是相当糟糕的,但。
当我开始水平滚动(或一扔),我必须非常小心,以使其发挥作用。
一旦水平滚动包含一个(小)垂直分量,垂直的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; // HorizontalScrollView数
私人最终静态INT M = 20; // TextViews单HorizontalScrollView内的数
@覆盖
保护无效的onCreate(包savedInstanceState)
{
super.onCreate(savedInstanceState);
的LinearLayout布局=新的LinearLayout(本);
//创建HorizontalScrollViews列表
最后HorizontalScrollView []开胃=新HorizontalScrollView [N];
的for(int i = 0; I< hors.length;我++)
{
开胃[我] =新HorizontalScrollView(这一点,NULL);
小吃[I] .setMinimumHeight(60);
的LinearLayout LL =新的LinearLayout(本);
ll.setOrientation(LinearLayout.HORIZONTAL);
开胃[I] .addView(LL);
对于(INT J = 0; J<米; J ++)
{
TextView的T =新的TextView(Test.this);
t.setText(HorizontalScrollView:+ I +; TextView中:+ J);
t.setMinimumHeight(40);
ll.addView(T);
}
}
//添加一个ListView
ListView控件列表=新的ListView(本);
layout.addView(名单);
list.setAdapter(新BaseAdapter()
{
@覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup)
{
返回开胃[位置]
}
@覆盖
众长getItemId(INT位置)
{
返回0;
}
@覆盖
公共对象的getItem(INT位置)
{
返回开胃[位置]
}
@覆盖
公众诠释getCount将()
{
返回N;
}
});
的setContentView(布局);
}
}
问题是,的ListView
(或者更确切地说,它的父 AbsListView
)实现 onInterceptTouchEvent
,因此的ListView
因为它认为这是一个可以尽快截获所有的触摸事件更好地处理它们。
这可避免通过调用 requestDisallowInterceptTouchEvent
,例如:通过子类化 HorizontalScrollView
,并在其 dispatchTouchEvent
:
公共布尔dispatchTouchEvent(MotionEvent EV)
{
布尔RET = super.dispatchTouchEvent(EV);
如果(RET)
{
requestDisallowInterceptTouchEvent(真正的);
}
返回RET;
}
它需要一些修饰(如只能叫 requestDisallowInterceptTouchEvent
如果水平分量比垂直的大),因为现在很少允许的ListView
掌握控制权。
In my example activity, I have
- a ListView containing
- multiple HorizontalScrollView containing
- a set of TextView
The horizontal scrolling experience is rather bad though.
When I initiate a horizontal scroll (or fling), I must be very careful to make it work.
As soon as the horizontal scroll contains a (small) vertical component, the vertical ListView scrolling takes over and stops the horizontal scrolling completely.
Any suggestion on how to improve this?
Thanks in advance,
Marc
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);
}
}
The problem is that ListView
(or rather its parent AbsListView
) implements onInterceptTouchEvent
and hence ListView
can intercept all touch events as soon as it considers it is in a better position to handle them.
This can be avoided by calling requestDisallowInterceptTouchEvent
, e.g. by subclassing HorizontalScrollView
and in its dispatchTouchEvent
:
public boolean dispatchTouchEvent(MotionEvent ev)
{
boolean ret = super.dispatchTouchEvent(ev);
if(ret)
{
requestDisallowInterceptTouchEvent(true);
}
return ret;
}
It needs some refinement (like only call requestDisallowInterceptTouchEvent
if the horizontal component is larger than the vertical one) since now it hardly ever allows the ListView
to take control.
这篇关于HorizontalScrollView里面的ListView:轻微垂直滚动停止水平滚动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!