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

时间:2011-11-07 11:25:40

标签: android android-layout

在我的示例活动中,我有 - 包含
的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);

}


}

4 个答案:

答案 0 :(得分:5)

问题在于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控制。

答案 1 :(得分:1)

虽然我没有在你的代码里面挖掘,但人们常犯的错误是在ScrollView中插入listView。

因为listview是自动滚动的,所以将它保存在scrollView之外,而其他东西可能在scrollView中。

检查这是否是场景,否则共享XML布局

答案 2 :(得分:0)

Android有一个名为touch slop的概念。这里有一个类似的问题已经回答:Android ACTION_MOVE Threshold

答案 3 :(得分:0)

最佳方式。

将给定的代码放在你的水平listview onScroll方法上,它可以正常工作

   ViewParent view_parent = getParent();
   if (view_parent != null) 
   {
     view_parent.requestDisallowInterceptTouchEvent(true);
   }