2011-11-07 81 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); 
    }