2011-06-26 28 views
5

Jestem tu tak blisko i próbowałem wielu rzeczy, ale nie mogę go uruchomić. Mam tu dwa listy odsłon. To, czego chcę, to dla każdego wyświetlenia listy, aby pokazać CAŁĄ zawartość. Nie chcę przewijać listy wyświetleń. Chcę Scrollview, który ma przewijane listy odsłon. Najbliżej udało mi się go zdobyć (co jest nie tak), aby każdy listview był przewijany. Oznacza to, że każdy widok listy pokazuje tylko 1 1/2 komórek. Myślę, że byłoby to proste, ale Android ma dziwne rzeczy.Dwa widoki listy i ScrollView

Tak więc, każdy widok listy pokazuje całą zawartość, nawet jeśli ta wysokość zawartości przechodzi poza ekran. Następnie wystarczy przewinąć w dół, aby zobaczyć drugi widok listy, który pokazuje całą zawartość.

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_height="fill_parent" 
android:layout_width="wrap_content" 
android:orientation="vertical" 
android:fillViewport="true"> 
<LinearLayout 
android:layout_height="fill_parent" 
android:layout_width="wrap_content" 
android:orientation="vertical" 
android:fillViewport="true"> 
<LinearLayout 
android:layout_weight="10" 
android:orientation="vertical" 
android:layout_height="wrap_content" 
android:layout_width="fill_parent"> 
<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:background="#CCCCCC" 
android:text="@string/alerts_top_title" 
android:gravity="center" 
android:textColor="#000000" 
android:layout_centerVertical="true" 
android:layout_centerHorizontal="true"> 
</TextView> 
<ListView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:id="@+id/cameraListAlerts" > 
</ListView> 
</LinearLayout> 
<LinearLayout 
android:layout_weight="10" 
android:orientation="vertical" 
android:layout_height="wrap_content" 
android:layout_width="fill_parent"> 
<TextView 
android:gravity="center" 
android:layout_centerVertical="true" 
android:layout_centerHorizontal="true" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:background="#CCCCCC" 
android:textColor="#000000" 
android:text="@string/alerts_bottom_title"> 
</TextView> 
<LinearLayout 
android:layout_width="fill_parent" 
android:layout_height="8dp"> 
</LinearLayout> 
<Button 
android:id="@+id/addRecipient" 
android:layout_height="50dp" 
android:layout_width="fill_parent" 
android:layout_centerHorizontal="true" 
android:text="@string/addRecipient"/> 

<ListView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:id="@+id/recipientListAlerts" > 
</ListView> 
</LinearLayout> 
</LinearLayout> 
</ScrollView> 
+2

'ListView's nie wchodzą w' ScrollView's. Wypełniaj listy w programie LinearLayout programowo, zamiast używać listView. Właśnie tego chcesz. –

+0

Wiedziałem, że ktoś zostanie wyrzucony. Czy nie istnieje sposób, w jaki mogę to zrobić, nie robiąc tak dużo pracy? – spentak

Odpowiedz

9

Spędzicie dużo więcej czasu i energii, próbując zmusić to do działania, jeśli kiedykolwiek to zrobi. ListView s istnieją w celu obsługi długich list, które wymagają jednoczesnego użycia zbyt wielu zasobów. Odzyskują widoki wierszy podczas przewijania ich, aby umożliwić ładowanie. Próbujesz pozbyć się tej funkcji, przez co korzystanie z urządzenia ListView jest zasadniczo bezcelowe.

Zapełnianie programu LinearLayout nie jest żadnym problemem. Czy masz plik XML dla swoich wierszy? Napełnij go dla każdego nowego wiersza, uruchamiając wyjątkowo prostą pętlę for za pośrednictwem pętli Array lub while za pomocą kursora, wiążąc dane i dodając je do swojej LinearLayout.

Gotowe. Brak problemów z przewijaniem ... wszystko jest obsługiwane przez ScrollView, tak jak powinno być.

+0

Mam mnóstwo kodu, który działa poprzez moje niestandardowe adaptery i programy obsługi zdarzeń (dla kliknięć elementów i takie). W jaki sposób mógłbym włączyć twoją metodę bez dokonywania poważnych modyfikacji tego wszystkiego? – spentak

+0

Więc wolisz zmusić ListViews do zrobienia czegoś, do czego nie były przeznaczone? Jest to dobrze znany fakt każdemu, kto ma niewielkie doświadczenie ListView, że nie może poprawnie działać w ScrollView o tej samej orientacji. Proponuję obejrzenie tego filmu z Google IO 2010: http://www.youtube.com/watch?v=wDBM6wVEO70 – zienkikk

+0

Co to za element kliknięć? Kliknięcia wierszy? Właśnie ustawiłem 'android: onClick' w wierszu XML na pewną metodę, następnie użyj' setTag (index [array] lub id [cursor]) 'w pętli, abyś mógł wywołać' getTag() 'na Widok, który został przekazany do metody ustawionej w atrybucie onClick i rozpoznać, który element został kliknięty. Wtedy możesz działać odpowiednio. Może być na to bardziej elegancki sposób. W przypadku innych widoków w tym widoku (powiedzmy, klikając obraz w wierszu opisującym kontakt), utworzę bardzo szybki niestandardowy widok. Może to zabrzmieć jak dużo pracy, ale jest to o wiele lepsze podejście. –

0

Spróbuj tego,

private ListView first, second; 
private String check=""; 
String[] COUNTRIES = new String[] { "Afghanistan", "Albania", 
     "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", 
     "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia", 
     "Aruba", "Australia", "Austria", "Azerbaijan", "Bahrain", 
     "Montserrat", "Morocco", 
     "Mozambique", "Myanmar", "Namibia", "Nauru", "NepalA", 
     "Montserrat", "MoroccoF", 
     "Mozambique", "Myanmar", "Namibia", "Nauru", "NepalB", 
     "Montserrat", "MoroccoD", 
     "Mozambique", "Myanmar", "Namibia", "Nauru", "NepalC", 

}; 

String[] COUNTRIES1 = new String[] { "Martinique", 
     "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia", 
     "Moldova", "Monaco", "Mongolia", "Montserrat", "Morocco", 
     "Mozambique", "Myanmar", "Namibia", "Nauru", "Nepal", }; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    first = (ListView) findViewById(R.id.firstlist); 
    second = (ListView) findViewById(R.id.secondlist); 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, COUNTRIES); 
    ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, COUNTRIES1); 

    first.setAdapter(adapter); 
    second.setAdapter(adapter1); 

    second.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View arg0, MotionEvent arg1) { 
     check="second"; 
    return false; 
    } 
     }); 

    first.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View arg0, MotionEvent arg1) { 
      check="first"; 
     return false; 
     } 
      }); 
    first.setOnScrollListener(newScrollEvent); 
    second.setOnScrollListener(newScrollEvent); 
} 

private OnScrollListener newScrollEvent = new OnScrollListener() { 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
      int visibleItemCount, int totalItemCount) { 
     // TODO Auto-generated method stub 
     if(check.equalsIgnoreCase("first")){ 
     System.out.println("first"); 

     if (first.getChildAt(0) != null) { 
     Rect r1 = new Rect(); 
     first.getChildVisibleRect(first.getChildAt(0), r1, null); 
     second.setSelectionFromTop(first.getFirstVisiblePosition(), 
     r1.top); 
     } 
     } 
     else if(check.equalsIgnoreCase("second")){ 
     if (second.getChildAt(0) != null) { 
     Rect r1 = new Rect(); 
     second.getChildVisibleRect(second.getChildAt(0), r1, null); 
     first.setSelectionFromTop(second.getFirstVisiblePosition(), 
     r1.top); 
     } 
     } 
    } 
}; 
0

tworzyć Scrollview w czasie wykonywania jak ten sposób.

//find parent xml layout 
     LinearLayout lL1 =(LinearLayout)rootView.findViewById(R.id.pro_scroll); 

     //Create ScrollView programatically 
      ScrollView _scrollView = new ScrollView(appContext); 
      _scrollView.setBackgroundColor(Color.WHITE); 
      _scrollView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 
    LayoutParams.MATCH_PARENT)); 

     ViewGroup layout=new LinearLayout(appContext); 
          layout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 

//add scrollview to layout 
          layout.addView(_scrollView); 
//add layout to xml parent layout 
          lL1.addView(layout); 
Powiązane problemy