android - ListView 内的 Horizo​​ntalScrollView : minor vertical scroll stops horizontal scroll

标签 android android-layout

在我的示例 Activity 中,我有
- 包含
的 ListView - 包含多个 Horizo​​ntalScrollView
- 一组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 来避免,例如通过子类化 Horizo​​ntalScrollView 并在其 dispatchTouchEvent 中:

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

它需要一些改进(比如只在水平分量大于垂直分量时调用 requestDisallowInterceptTouchEvent)因为现在它几乎不允许 ListView 进行控制。

关于android - ListView 内的 Horizo​​ntalScrollView : minor vertical scroll stops horizontal scroll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8035817/

相关文章:

android - 如何获得固定宽度的文本高度并获得适合框架的文本长度?

java - 上传包错误

java - 为什么我会收到 android.database.sqlite.sqlitecursor @ 错误

Android:支持同一尺寸类别内的多种屏幕尺寸

java - 动态添加 ScrollView 到线性布局

android - 如何将变量的值传递给android中的另一个方法

android - 在 eclipse 中构建 workSpace 的问题

android - 在android中单击按钮时如何转到Edittext

android - 再次替换根Fragment时,Fragment的ViewPager不显示其内容

Android,如何获取/设置布局参数?