2010-12-02 11 views
12

Debería querer un ListView no desplazable y mostrar todo ListView. Es porque toda mi pantalla es una ScrollView y distribuyo widgets con RelativeLayout, por lo que no necesito el desplazamiento ListView.¿Cómo obtener un ListView no desplazable?

Configuré mi interfaz de usuario con código, no con xml.

He usado listView.setScrollContainer(false), pero no funciona, no entiendo por qué.

Gracias.

Respuesta

10

No coloque una vista de lista en una vista de desplazamiento, no funciona. Si desea una lista de elementos que no se desplaza, se denomina distribución lineal.

+1

Sí, lo hago, gracias. ¿Pero después de cómo hago lo mismo que ListView en clic en una línea? (Lo siento, soy un usuario de Android.) – Istao

+3

@Istao: puede vincular un OnClickListener o OnTouchListener a una vista que se activará cuando se haga clic o se toque. – Flo

+0

Muy bien, gracias a Flo y Falmarri. – Istao

15

La respuesta correcta is here.

Basta con asignar esta escucha a su ListView:

listView.setOnTouchListener(new OnTouchListener() { 

    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      return true; // Indicates that this has been handled by you and will not be forwarded further. 
     } 
     return false; 
    } 
}); 
14

he encontrado una solución muy simple para esto. Simplemente obtenga el adaptador de la vista de lista y calcule su tamaño cuando se muestren todos los elementos. La ventaja es que esta solución también funciona dentro de ScrollView.

Ejemplo:

public void justifyListViewHeightBasedOnChildren (ListView listView) { 

    ListAdapter adapter = listView.getAdapter(); 

    if (adapter == null) { 
     return; 
    } 
    ViewGroup vg = listView; 
    int totalHeight = 0; 
    for (int i = 0; i < adapter.getCount(); i++) { 
     View listItem = adapter.getView(i, null, vg); 
     listItem.measure(0, 0); 
     totalHeight += listItem.getMeasuredHeight(); 
    } 

    ViewGroup.LayoutParams par = listView.getLayoutParams(); 
    par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1)); 
    listView.setLayoutParams(par); 
    listView.requestLayout(); 
} 

llamar a esta función de pasar sobre el objeto ListView:

justifyListViewHeightBasedOnChildren(myListview); 

La función mostrada arriba es una modificación de un mensaje en: Disable scrolling in listview

Tenga en cuenta a llame a esta función después de haber configurado el adaptador en la vista de lista. Si el tamaño de las entradas en el adaptador ha cambiado, debe llamar a esta función también.

+2

Gracias. Tu respuesta es genial. Debería haber una forma de dejar que la vista de lista sepa que ESTO es exactamente lo que queremos (necesito un scrollview con una pequeña lista dentro y mientras estoy reutilizando el fragmento con la vista de lista no quiero para cambiar y usar LinearLayout). No pude encontrar una mejor manera de hacerlo, por lo que tu respuesta es la mejor que pude encontrar. Espero que tenga más votos ascendentes. Se los merece. – acrespo

+0

trabajando para mí también. –

0

Se me ocurrió BaseAdapterUnscrollable. Básicamente solo agrega vistas al contenedor ViewGroup. La implementación es un poco como BaseAdapter. Es muy conveniente si usa algunas listas no desplazables como las de su proyecto.

En onCreate:

PeopleAdapter peopleAdapter = new PeopleAdapter(this, personList, containerPeopleLinearLayout); 
peopleAdapter.setOnItemClickListener(this); 
peopleAdapter.drawItems(); 

Su adaptador específico:

public class PeopleAdapter extends BaseAdapterNonScrollable<Person> { 

public PeopleAdapter(Context context, List<Person> items, LinearLayout container) { 
    super(context, items, container); 
} 

@Override 
public View getView(View container, Person person) { 
    TextView textView = (TextView) LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1, null); 
    textView.setText(person.getName()); 
    return textView; 
} 

}

BaseAdapterNonScrollable (simplemente copiar):

public abstract class BaseAdapterNonScrollable<T> implements NonScrollable, OnItemClick { 

public Context context; 
private ViewGroup containerViewGroup; 
private List<T> itemObjectList; 
private OnItemClick itemClickListener; 

public BaseAdapterNonScrollable(Context context, List<T> items, ViewGroup containerViewGroup) { 
    this.context = context; 
    this.itemObjectList = items; 
    this.containerViewGroup = containerViewGroup; 
} 

@Override 
public void drawItems() { 
    if (containerViewGroup == null || itemObjectList.size() == 0) { 
     return; 
    } 

    if (containerViewGroup.getChildCount() > 0) { 
     containerViewGroup.removeAllViews(); 
    } 

    //draw all items 
    for (int i = 0; i < itemObjectList.size(); i++) { 
     final int position = i; 
     final View itemView = getView(containerViewGroup, itemObjectList.get(i)); 
     if (itemView != null) { 
      containerViewGroup.addView(itemView); 
      //handle item click event 
      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (itemClickListener != null) { 
         itemClickListener.onItemClick(itemObjectList, position); 
        } 
       } 
      }); 
     } 
    } 
} 

public void setOnItemClickListener(OnItemClick onItemClick) { 
    this.itemClickListener = onItemClick; 
} 

public abstract View getView(View container, T itemObject); 

@Override 
public void onItemClick(List<?> itemList, int position) { 
} 

}

Interfaces

public interface NonScrollable { 
    void drawItems(); 
} 

public interface OnItemClick { 
    void onItemClick(List<?> itemList, int position); 
} 
0

para desactivar el desplazamiento puede utilizar listview.setEnabled(false)

desactiva Esto también selecciones fila.

Cuestiones relacionadas