Horizo​​ntalScrollView里面的ListView:轻微垂直滚动停止水平滚动 [英] HorizontalScrollView inside ListView: minor vertical scroll stops horizontal scroll

查看:84
本文介绍了Horizo​​ntalScrollView里面的ListView:轻微垂直滚动停止水平滚动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的例子活动,我已经
- 一个ListView包含
- 多Horizo​​ntalScrollView含
- 一组的TextView的

水平滚动的经验是相当糟糕的,但。
当我开始水平滚动(或一扔),我必须非常小心,以使其发挥作用。

一旦水平滚动包含一个(小)垂直分量,垂直的ListView滚动接管并完全停止了水平滚动。

关于如何提高这任何建议?

在此先感谢,

马克·

 进口android.app.Activity;
进口android.database.DataSetObserver;
进口android.os.Bundle;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.BaseAdapter;
进口android.widget.Horizo​​ntalScrollView;
进口android.widget.LinearLayout;
进口android.widget.ListAdapter;
进口android.widget.ListView;
进口android.widget.RelativeLayout;
进口android.widget.TextView;

公共类测试扩展活动
{
私人最终静态INT N = 20; // Horizo​​ntalScrollView数
私人最终静态INT M = 20; // TextViews单Horizo​​ntalScrollView内的数


@覆盖
保护无效的onCreate(包savedInstanceState)
{
    super.onCreate(savedInstanceState);
    的LinearLayout布局=新的LinearLayout(本);
    //创建Horizo​​ntalScrollViews列表
    最后Horizo​​ntalScrollView []开胃=新Horizo​​ntalScrollView [N];
    的for(int i = 0; I< hors.length;我++)
    {
        开胃[我] =新Horizo​​ntalScrollView(这一点,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.se​​tText(Horizo​​ntalScrollView:+ I +; TextView中:+ J);
            t.se​​tMinimumHeight(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 ,例如:通过子类化 Horizo​​ntalScrollView ,并在其 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.

这篇关于Horizo​​ntalScrollView里面的ListView:轻微垂直滚动停止水平滚动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆