2011-11-07 80 views
4

在我的例子活动,我有
- 包含
一个ListView - 包含多个Horizo​​ntalScrollView
- 一组的TextViewHorizo​​ntalScrollView里面的ListView:轻微的垂直滚动停止水平滚动

水平滚动的经验是相当糟糕虽然。
当我启动一个水平滚动(或一扔)时,我必须非常小心地使它工作。

只要水平滚动包含(小)垂直分量,垂直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); 

} 


} 
+0

我想我能改写了一个问题,“有可能是一个子视图接收ListView的父消耗的TouchEvents”。这将允许ListView处理我移动的垂直分量,Horizo​​ntalScrollView可以处理移动的水平分量。 –

回答

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

虽然我没有你的代码里面挖,但一般的错误的人做的是滚动型里面插入的ListView。

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

检查如果是这种情况,否则份额XML布局

+0

我的ListView是父组件,Horizo​​ntalScrollViews是ListView的子组件(因此它似乎是您的场景的另一种方式)。我不使用XML布局;所有视图都在代码中创建。 –

0

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

+0

我不认为mTouchSlop在这里是相关的。原来的问题是一个小的垂直滚动停止水平滚动,因为那时ListView正在接管。 –

0

最好的方法来做到这一点。你的水平的ListView onScroll方法

放给定的代码它的工作perfact

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