2011-06-26 18 views
5

Estoy muy cerca aquí y he intentado muchas cosas pero no puedo hacerlo funcionar. Tengo dos listas aquí. Lo que quiero es que cada vista de lista muestre su contenido COMPLETO. No quiero que las listas sean desplazables. Quiero la vista de desplazamiento que mantiene las listas de desplazamiento desplazables. Lo más cerca que he podido conseguirlo (lo que está mal) es que cada vista de lista es desplazable. Esto significa que cada vista de lista solo muestra 1 1/2 celdas. Pensaría que esto sería una tarea simple pero Android tiene algunas cosas estrafalarias.Two ListViews & ScrollView

De nuevo, cada vista de lista muestra todo su contenido, incluso si la altura del contenido va más allá de la pantalla. Entonces, todo lo que tengo que hacer es desplazarme hacia abajo para ver la segunda vista de lista que muestra todo su contenido.

<?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 no entran en' ScrollView's. Complete sus listas en LinearLayout mediante programación en lugar de utilizar 'ListView's. Eso es exactamente lo que quieres. –

+0

Sabía que uno iba a ser expulsado. ¿No hay una manera en que pueda lograr que esto funcione sin hacer tanto trabajo? – spentak

Respuesta

9

Vas a gastar mucho más tiempo y energía tratando de hacer que esto funcione si alguna vez lo hace. ListView s existen para manejar listas largas que requieren que se dibujen demasiados recursos a la vez. Reciclan las vistas de fila cuando se desplaza por ellas para permitir una carga ágil. Está tratando de deshacerse de esa funcionalidad, haciendo que su uso del ListView sea esencialmente inútil.

Poblando un LinearLayout programáticamente no es gran cosa en absoluto. ¿Tienes un archivo XML para tus filas? Inflarlo para cada nueva fila a medida que ejecuta un circuito extremadamente simple for a través de su Array o while loop a través de su Cursor, vinculando los datos y agregándolo a su LinearLayout.

Listo. Sin problemas de desplazamiento ... todo es manejado por ScrollView como debería ser.

+0

Tengo toneladas de código que funciona a través de mis adaptadores personalizados y controladores de eventos (para clics de elementos y cosas por el estilo). ¿Cómo incorporaría su método sin hacer una gran modificación de todas esas cosas? – spentak

+0

¿Prefiere forzar que ListViews haga algo para lo que no fueron diseñados? Es un hecho bien conocido para cualquier persona con un poco de experiencia ListView que no pueden funcionar correctamente dentro de una vista de desplazamiento con la misma orientación. Le sugiero que vea este video de Google IO 2010: http://www.youtube.com/watch?v=wDBM6wVEO70 – zienkikk

+0

¿Qué tipo de elemento hace clic? ¿Clic de fila? Acabo de configurar 'android: onClick' en el XML de la fila con algún método, luego uso' setTag (index [array] o id [cursor]) 'en el loop para que luego pueda llamar a' getTag() ' la vista que se pasó al método que configuraste en el atributo onClick y discernir en qué elemento se hizo clic. Entonces puedes actuar en consecuencia. Puede haber una manera más elegante de hacer eso. Para otras vistas dentro de esa vista (por ejemplo, haciendo clic en una imagen en una fila que describe un contacto), crearía una vista personalizada muy rápida. Puede sonar como un montón de trabajo, pero es un enfoque mucho mejor. –

0

Prueba de esto,

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

crear ScrollView en tiempo de ejecución como de esta manera.

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