繁体   English   中英

ListView中的Horizo​​ntalScrollView:次要垂直滚动停止水平滚动

[英]HorizontalScrollView inside ListView: minor vertical scroll stops horizontal scroll

在我的示例活动中,我有
-包含的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来避免这种情况,例如,通过将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM