2011-10-05 7 views
11

Tengo un diseño. Este diseño contiene 3 vistas de lista con la altura de los datos de wrap_content en Listview no son correcciones. Cuando Listview tiene una gran cantidad de datos en ese momento, los datos pasan a la parte inferior y los datos no se pueden ver, por lo que quiero desplazar la vista con los tres Listview para ver cómo es posible.Cómo desplazar el diseño que tiene 3 vista de lista

¿Alguien tiene una idea sobre esto?

Esta es mi vista que contiene 3 Listview, ahora es con menos datos, pero cuando los datos serán enormes en ese momento, la última Listview tiene un problema para ver. Quiero desplazar la vista de color gris ...

enter image description here

Respuesta

7

Utilice el diseño lineal en lugar de listview en su archivo xml. Este es su archivo xml.

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView android:id="@+id/scr" android:layout_height="fill_parent" 
    android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <LinearLayout android:layout_width="fill_parent" 
     android:id="@+id/r2" android:orientation="vertical" 
     android:layout_height="fill_parent" android:paddingTop="100dip" 
     android:paddingBottom="100dip"> 
     <LinearLayout android:layout_width="fill_parent" 
      android:id="@+id/l1" android:orientation="vertical" 
      android:layout_height="wrap_content" android:layout_marginTop="10dip" 
      android:background="#00B2EE"> 
     </LinearLayout> 
     <LinearLayout android:layout_width="fill_parent" 
      android:id="@+id/l2" android:orientation="vertical" 
      android:layout_height="wrap_content" android:layout_marginTop="10dip" 
      android:background="#00EE76"> 

     </LinearLayout> 
     <LinearLayout android:layout_width="fill_parent" 
      android:id="@+id/l3" android:orientation="vertical" 
      android:layout_height="wrap_content" android:layout_marginTop="10dip" 
      android:background="#7171C6"> 
     </LinearLayout> 
    </LinearLayout> 
</ScrollView> 

y ponga otro xml que se inflará por la lista.

esta es su principal clase de actividades.

package com.list.add; 

import java.util.ArrayList; 
import java.util.List; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 
import android.widget.ScrollView; 
import android.widget.TextView; 

public class NewlistActivity extends Activity { 
    /** Called when the activity is first created. */ 
    LinearLayout l1,l2,l3; 
    ScrollView scrollView; 
    ViewGroup contentView; 
    List<String> list = new ArrayList<String>(); 
    List<String> list1 = new ArrayList<String>(); 
    List<String> list2 = new ArrayList<String>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     l1 = (LinearLayout) findViewById(R.id.l1); 
     l2 = (LinearLayout) findViewById(R.id.l2); 
     l3 = (LinearLayout) findViewById(R.id.l3); 
     scrollView = (ScrollView) findViewById(R.id.scr); 
     contentView = (ViewGroup) findViewById(R.id.r2); 
     scrollView.setOnTouchListener(new ScrollPager(scrollView, contentView)); 
     scrollView.post(new Runnable() { 
      public void run() { 
       scrollView.scrollTo(0, contentView.getPaddingTop()); 
      } 
     }); 
     list.add("Parth"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Parth"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Shah"); 
     list.add("Parth"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Parth"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Chirag"); 
     list.add("Shah"); 

     list1.add("Parth"); 
     list1.add("Parth"); 
     list1.add("Parth"); 
     list1.add("Parth"); 
     list1.add("Parth"); 
     list1.add("Parth"); 

     list2.add("Kalpesh"); 
     list2.add("Kalpesh"); 
     list2.add("Kalpesh"); 
     list2.add("Kalpesh"); 
     list2.add("Kalpesh"); 
     list2.add("Kalpesh"); 
     list2.add("Kalpesh"); 
     System.out.println(list); 
     System.out.println(list1); 
     System.out.println(list2); 
     for (int i=0; i<list.size(); i++) 
     { 
     LayoutInflater inflater = getLayoutInflater(); 
     View vi = inflater.inflate(R.layout.raw, null); 
     TextView tv = (TextView) vi.findViewById(R.id.textView1); 
     tv.setText(list.get(i)); 
     l1.addView(vi); 
     } 
     for (int i=0; i<list1.size(); i++) 
     { 
     LayoutInflater inflater = getLayoutInflater(); 
     View vi = inflater.inflate(R.layout.raw, null); 
     TextView tv = (TextView) vi.findViewById(R.id.textView1); 
     tv.setText(list1.get(i)); 
     l2.addView(vi); 
     } 
     for (int i=0; i<list2.size(); i++) 
     { 
     LayoutInflater inflater = getLayoutInflater(); 
     View vi = inflater.inflate(R.layout.raw, null); 
     TextView tv = (TextView) vi.findViewById(R.id.textView1); 
     tv.setText(list2.get(i)); 
     l3.addView(vi); 
     } 
    } 

} 

y hacer una clase scroller como esto:

public class ScrollPager implements OnTouchListener 
public ScrollPager(ScrollView aScrollView, ViewGroup aContentView) 
    { 
     mScrollView = aScrollView; 
     mContentView = aContentView; 
     scroller = new Scroller(mScrollView.getContext(), new OvershootInterpolator()); 
     task = new Runnable() 
     { 
      public void run() 
      { 
       scroller.computeScrollOffset(); 
       mScrollView.scrollTo(0, scroller.getCurrY()); 

       if (!scroller.isFinished()) 
       { 
        mScrollView.post(this); 
       } 
      } 
     }; 
    } 
public boolean onTouch(View v, MotionEvent event) 
    { 
     // Stop scrolling calculation. 
     scroller.forceFinished(true); 
     // Stop scrolling animation. 
     mScrollView.removeCallbacks(task); 

     if (event.getAction() == MotionEvent.ACTION_UP) 
     { 
+0

Esto funciona para mí. Entiendo que puede no ser muy eficiente desde el punto de vista de la memoria, ya que tendremos que hacerlo explícitamente, etc. pero en mi caso no estoy usando más de 5 elementos, así que estoy bien. Gracias – lazyguy

1

Debe utilizar el peso atribuyen android:layout_weight="1" en cada ListView en el diseño XML. De modo que dividirá la pantalla con el mismo espacio para cada vista de lista y su desplazamiento funcionará para cada ListView.

+0

hola sujit pero yo uso la disposición relativa en que el androide: layout_weight propiedad no se admite. –

+0

¿por qué está utilizando RelativeLayout? ¿Alguna razón específica? Deberías usar LinearLayout porque tienes 3 listView alineados verticalmente? – Sujit

+0

pero el diseño de la aplicación importa con esta vista, así que necesito este diseño en el diseño relativo. –

1

Si está presentando material en una pila vertical u horizontal, debe usar LinearLayout y luego usar el atributo layout_weight para controlar las proporciones de las filas/columnas individuales dentro del contenedor.

Si desea tamaño de pantalla, establezca layout_width y layout_height en fill_parent, de lo contrario, no obtendrá todas las dimensiones de pantalla disponibles. Si intenta usar wrap_content para la altura, todo colapsará, a menos que recurra a restricciones de diseño adicionales, p. minHeight.

Usamos esto en todas partes y es bastante confiable. Para tres elementos, puede usar 1/1/1 o 3/3/3.

¡Los pesos tampoco tienen que ser iguales! Puedes dividir las proporciones de la forma que desees; los pesos son solo proporciones relativas de todo el tramo (ancho/alto). P.ej. si desea que el elemento medio tenga el doble del tamaño, use 1/2/1; si lo desea, use el 40% de 30/40/30 o 3/4/3.

Un buen "truco" es usar layout_weight = 1 en exactamente una fila/columna (otros valores predeterminados a cero), y "completará" cualquier espacio restante. Este es un escenario de distribución común.

Si necesita que la pila sea desplazable, puede ponerla en ScrollView. En este caso, debe configurar el layout_height del LinearLayout en wrap_content, y estará sujeto al colapso dependiendo del capricho del sistema de disposición (lo que significa que debe usar restricciones mínimas/máximas).

1

su lugar, vamos Dame mi mejor idea para el mismo tipo de aplicación.

¿Alguna vez ha pensado en usar ExpandableListView para el mismo tipo de implementación? Simplemente muestre el primer ítem grupal como expandido y haga que los otros 2 grupos se contraigan, solo amplíelo cuando el usuario haga clic en el grupo en particular.

Éstos son algunos ejemplos de los mismos:

  1. http://techdroid.kbeanie.com/2010/09/expandablelistview-on-android.html
  2. http://coderzheaven.com/2011/04/expandable-listview-in-android-using-simpleexpandablelistadapter-a-simple-example/

Estoy seguro de que esta idea no es buena, pero si se implementa esto entonces que usted seguro encontrado beneficioso en su caso.

1

Uso este método y su vista de lista desplazable en el interior se convierta en ScrollView: -

ListView lstNewsOffer.setAdapter(new ViewOfferAdapter(
         ViewNewsDetail.this, viewOfferList)); 
       getListViewSize(lstNewsOffer); 

void getListViewSize(ListView myListView) { 
ListAdapter myListAdapter = myListView.getAdapter(); 
if (myListAdapter == null) { 
    // do nothing return null 
    return; 
} 
// set listAdapter in loop for getting final size 
int totalHeight = 0; 
for (int size = 0; size < myListAdapter.getCount(); size++) { 
    View listItem = myListAdapter.getView(size, null, myListView); 
    listItem.measure(0, 0); 
    totalHeight += listItem.getMeasuredHeight(); 
} 
// setting listview item in adapter 
ViewGroup.LayoutParams params = myListView.getLayoutParams(); 
params.height = totalHeight 
     + (myListView.getDividerHeight() * (myListAdapter.getCount() - 1)); 
myListView.setLayoutParams(params); 
// print height of adapter on log 
Log.i("height of listItem:", String.valueOf(totalHeight)); 

}

Cuestiones relacionadas