1

我有一個ScrollView。它的一個孩子是一個ListView。兩個滾動方向相同。我如何讓他們都回復滾動事件?然後,當ListView的結束時,事件轉到父ScrollView,以便ScrollView可以滾動?在ScrollView中滾動ListView

XML佈局:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
... 
android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 

    <LinearLayout 
     ... 
     android:orientation="vertical" 
     > 



     <LinearLayout 
      android:id="@+id/..." 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="0" 

      android:orientation="horizontal"> 

      ... 
     </LinearLayout> 

     <android.support.v4.view.ViewPager 
      .../> 


     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:padding="@dimen/pad_half" 
      > 
     </RelativeLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal" 
      android:gravity="center_vertical" 
      > 
     </LinearLayout> 



    </LinearLayout> 
</ScrollView> 

我的ListView實際上那張ViewPager內。該設計使ListView中的三個項目可見,並且用戶可以滾動查看其他項目。與此同時,ViewPager上方和下方的視圖都可見。再次,它是一個ViewPager:它有其他頁面而不是ListView。

+2

「你不應該使用帶有ListView的ScrollView,因爲ListView負責自己的垂直滾動。」 http://developer.android.com/reference/android/widget/ScrollView.html話雖如此,你試圖實現什麼? –

+0

scrollView有許多孩子。其中一個碰巧是一個ListView,它本身需要滾動。 –

+0

請張貼您的佈局。你應該重新考慮它。 –

回答

6

你不應該在ScrollView中有一個列表視圖。

但是你可以有一個自定義的類,並使用它來完成一個ListView中的ScrollView。

請嘗試以下代碼

首先製作一個自定義ScrollView類。

public class VerticalScrollview extends ScrollView{ 

public VerticalScrollview(Context context) { 
    super(context); 
} 

public VerticalScrollview(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public VerticalScrollview(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    final int action = ev.getAction(); 
    switch (action) 
    { 
     case MotionEvent.ACTION_DOWN: 
       super.onTouchEvent(ev); 
       break; 

     case MotionEvent.ACTION_MOVE: 
       return false; // redirect MotionEvents to ourself 

     case MotionEvent.ACTION_CANCEL: 
       super.onTouchEvent(ev); 
       break; 

     case MotionEvent.ACTION_UP: 
       return false; 

     default: break; 
    } 

    return false; 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    super.onTouchEvent(ev); 
    return true; 
} 
} 

然後使用這個類爲您佈局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@android:color/white" 
android:orientation="vertical" > 

<com.gui.today.VerticalScrollview 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#000000" 
    tools:context=".MainActivity" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 
    <FrameLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" > 

      <ProgressBar 
       android:id="@+id/progressBar3" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_vertical|center_horizontal" /> 

      <TextView 
       android:id="@+id/empty_calender" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_vertical|center_horizontal" 
       android:text="@string/empty_calender" 
       android:textColor="#ffffff" 
       android:visibility="gone" /> 

      <ListView 
       android:id="@+id/listView2" 
       android:layout_width="fill_parent" 
       android:layout_height="150dp" > 
      </ListView> 
     </FrameLayout> 
    </LinearLayout> 
    </com.gui.today.VerticalScrollview> 
+0

當真正的專家張嘴時發生了什麼令人驚訝的事情。感謝今天成爲我的嚮導。那些負面的人應該向你學習。 +1並檢查。 –

+0

我很高興它幫助你:) – Naman

+0

這是一個很好的答案,但是如果LinearLayout的其他任何子視圖都有一個點擊偵聽器,那麼我不能使用它們來滾動ScrollView。所以基本上對於大部分屏幕來說,滾動視圖是不可滾動的。看到我的問題:http:// stackoverflow。COM /問題/ 20289065 /怎麼辦,我使用-列表視圖,爲一的最-兒童期的一,滾動視圖 – learner

0

你不能滾動listview方向與scrollview相同。但是,如果您有水平線scrollview,則可以使用listview滾動垂直線。

3

我有一個滾動型

擺脫它。

它的一個孩子是一個ListView

ListView將所有的東西,或者使用addHeaderView()/addFooterView()my MergeAdapter,或沿着這些線路的東西。

0

你不能在滾動視圖中添加一個ListView,如列表視圖也scolls並會有的ListView盤之間的控制同步問題和滾動視圖scoll 。您可以創建一個CustomList視圖並將其添加到其中。

@Override public boolean onInterceptTouchEvent(MotionEvent ev) 
{ 
    /* 
    * Prevent parent controls from stealing our events once we've gotten a touch down 
    */ 
    if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { 
     ViewParent p = getParent(); 
     if (p != null) { 
      p.requestDisallowInterceptTouchEvent(true); 
     } 
    } 
    return false; 
}