¿Cómo obtener un ListView no desplazable?

Me gustaría 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.

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

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

Gracias.

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.

La respuesta correcta está aquí.

Simplemente asigne este oyente 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; } }); 

Encontré 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(); } 

Llame a esta función pasando por su objeto ListView:

 justifyListViewHeightBasedOnChildren(myListview); 

La función que se muestra arriba es una modificación de una publicación en: Deshabilitar el desplazamiento en lista

Tenga en cuenta que debe llamar 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.

Dependiendo de lo que intente hacer exactamente, es posible que pueda resolver su problema abandonando ScrollView y en su lugar usando addHeaderView(View) addFooterView(View) y addFooterView(View) .

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 { public PeopleAdapter(Context context, List 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 (solo copia):

 public abstract class BaseAdapterNonScrollable implements NonScrollable, OnItemClick { public Context context; private ViewGroup containerViewGroup; private List itemObjectList; private OnItemClick itemClickListener; public BaseAdapterNonScrollable(Context context, List 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); } 

para deshabilitar el desplazamiento, puede usar listview.setEnabled(false)

Esto también desactiva las selecciones de fila.