1

У меня есть ScrollView. Один из его детей - ListView. Оба прокрутки в одном направлении. Как заставить их отвечать на события прокрутки? И затем, когда конец ListView достигнут для события, чтобы перейти к родительскому ScrollView, чтобы ScrollView мог прокручиваться?прокрутка ListView в ScrollView

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

«Вы никогда не должны использовать ScrollView с ListView, потому что 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.ком/вопросы/20289065/как-делать-я потребительной ListView-в-одном-оф-детей-в-а-Scrollview – learner

0

Вы не можете прокрутить a listview в том же направлении, что и scrollview. Но если у вас есть горизонтальный scrollview, вы можете прокручивать по вертикали с помощью listview.

3

У меня есть ScrollView

Избавьтесь от него.

Один из его детей является ListView

Положите все в ListView, либо с помощью addHeaderView()/addFooterView(), my MergeAdapter, или еще что-то вдоль этих линий.

0

вы не можете добавить ListView в спиральном View, в виде списка также scolls и там будет проблема Synchonization между списке следует прокрутки и прокручивать вид scoll , Вы можете сделать CustomList View и добавить в него этот метод.

@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; 
} 
Смежные вопросы