2011-06-26 13 views
5

Sono così vicino qui e ho provato molte cose ma non riesco a farlo funzionare. Ho due listview qui. Quello che voglio è che ogni listview mostri il suo contenuto INTERO. Non voglio che le liste siano scorrevoli. Voglio il ScrollView che tiene scorrevoli i listview. Il più vicino che ho potuto ottenere (che è sbagliato) è così che ogni listview è scorrevole. Ciò significa che ogni listview mostra solo come 1 1/2 celle. Penserei che sarebbe un compito semplice ma Android ha alcune cose strane in corso.Two ListViews & ScrollView

Quindi, ancora una volta, ogni vista elenco mostra l'intero contenuto, anche se l'altezza del contenuto supera lo schermo. Quindi tutto quello che devo fare è scorrere verso il basso per vedere la seconda vista elenco che mostra tutto il suo contenuto.

<?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

'Gli oggetti di ListView non vanno in' ScrollView's. Popolare le liste in un LinearLayout a livello di codice invece di usare 'ListView's. Questo è esattamente quello che vuoi. –

+0

Sapevo che uno sarebbe stato buttato là fuori. Non c'è un modo per farlo funzionare senza fare tanto lavoro? – spentak

risposta

9

Hai intenzione di spendere molto più tempo ed energia cercando di farlo funzionare se mai lo fa. ListView s esistono per gestire lunghi elenchi che richiedono troppe risorse da estrarre contemporaneamente. Ricicla le Visualizzazioni di riga quando le scorri per consentire un caricamento rapido. Stai cercando di abbandonare questa funzionalità, rendendo così inutile l'utilizzo di ListView.

compilazione di una LinearLayout è a livello di codice un grosso problema a tutti. Hai un file XML per le tue righe? Gonfialo per ogni nuova riga mentre esegui un ciclo estremamente semplice di for attraverso il tuo array o il ciclo while attraverso il cursore, legando i dati e aggiungendoli al tuo LinearLayout.

Fatto. Nessun problema di scorrimento ... è gestito da ScrollView come dovrebbe essere.

+0

Ho un sacco di codice che funziona attraverso i miei adattatori personalizzati e gestori di eventi (per i clic degli articoli e così via). Come dovrei incorporare il tuo metodo senza apportare pesanti modifiche a tutte queste cose? – spentak

+0

Quindi preferisci forzare ListViews a fare qualcosa per cui non sono stati progettati? È noto a chiunque abbia una piccola esperienza di ListView che non può funzionare correttamente all'interno di una ScrollView con lo stesso orientamento. Ti suggerisco di guardare questo video da Google IO 2010: http://www.youtube.com/watch?v=wDBM6wVEO70 – zienkikk

+0

Bene, che tipo di clic sugli articoli? Clic di riga? Avrei semplicemente impostato 'android: onClick' nel file XML della riga in un qualche metodo, quindi ho usato' setTag (index [array] o id [cursor]) 'nel ciclo in modo da poter chiamare' getTag() 'su la vista passata al metodo che hai impostato nell'attributo onClick e discernete su quale elemento è stato fatto clic. Quindi puoi agire di conseguenza. Potrebbe esserci un modo più elegante per farlo. Per le altre viste all'interno di quella vista (ad esempio, facendo clic su un'immagine in una riga che descrive un contatto), creerei una vista personalizzata molto veloce. Può sembrare molto lavoro, ma è un approccio molto migliore. –

0

Prova questo,

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

creare ScrollView in fase di esecuzione, come in questo modo.

//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);