tutorial studio recyclerview llenar custom como agregar activity android listview

studio - lista de visualización de Android muestra todos los elementos disponibles sin desplazamiento con encabezado estático



llenar un listview android (11)

Como @Alex señaló en la respuesta aceptada que LinearLayout apenas es un reemplazo. Tuve un problema donde LinearLayout no era una opción, fue entonces cuando encontré este blog . Pondré el código aquí para referencia. Espero que ayude a alguien por ahí!

public class UIUtils { /** * Sets ListView height dynamically based on the height of the items. * * @param listView to be resized * @return true if the listView is successfully resized, false otherwise */ public static boolean setListViewHeightBasedOnItems(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter != null) { int numberOfItems = listAdapter.getCount(); // Get total height of all items. int totalItemsHeight = 0; for (int itemPos = 0; itemPos < numberOfItems; itemPos++) { View item = listAdapter.getView(itemPos, null, listView); item.measure(0, 0); totalItemsHeight += item.getMeasuredHeight(); } // Get total height of all item dividers. int totalDividersHeight = listView.getDividerHeight() * (numberOfItems - 1); // Set list height. ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalItemsHeight + totalDividersHeight; listView.setLayoutParams(params); listView.requestLayout(); return true; } else { return false; } } }

Uso:

//initializing the adapter listView.setAdapter(adapter); UIUtils.setListViewHeightBasedOnItems(listView); //whenever the data changes adapter.notifyDataSetChanged(); UIUtils.setListViewHeightBasedOnItems(listView);

Tengo algunas dificultades al intentar que funcione cierto diseño: quiero tener una lista. La lista no tiene que ser desplazable, pero debe mostrarse por completo. Pero la página en sí misma debería poder desplazarse (con las listas en ella), si el contenido total es más alto que la pantalla.

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linear_layout" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:background="#ff181818" > <Textview android:id="@+id/my_text" text="header contents goes here" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <Textview android:id="@+id/headertext" text="header contents goes here" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <ListView android:id="@+id/my_list1" android:layout_height="wrap_content" android:layout_width="fill_parent" /> </LinearLayout> </ScrollView>

solo usa una pequeña parte de la pantalla (alrededor de 2 líneas por lista), en lugar de llenar la altura disponible, y las listas mismas se pueden desplazar. ¿Cómo puedo cambiar el diseño para mostrar siempre las listas completas pero que la pantalla sea scrollalbe?


Establecer android:layout_height="fill_parent" en su LinearLayout


La solución que utilicé es reemplazar ListView con LinearLayout. Puede crear todos sus elementos dentro de LinearLayout, se mostrarán todos. Entonces realmente no hay necesidad de usar ListView.

LinearLayout list = (LinearLayout)findViewById(R.id.list_recycled_parts); for (int i=0; i<products.size(); i++) { Product product = products.get(i); View vi = inflater.inflate(R.layout.product_item, null); list.addView(vi); }


Lo hice usando parámetros de configuración de ListView

public static void setListViewHeightBasedOnChildren(ListView listView) { //this comes from value from xml tag of each item final int HEIGHT_LARGE=75; final int HEIGHT_LARGE=50; final int HEIGHT_LARGE=35; ViewGroup.LayoutParams params = listView.getLayoutParams(); int screenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK; switch(screenSize) { case Configuration.SCREENLAYOUT_SIZE_LARGE: params.height =(int) (HEIGHT_LARGE*size); break; case Configuration.SCREENLAYOUT_SIZE_NORMAL: params.height =(int) (HEIGHT_NORMAL*size); break; case Configuration.SCREENLAYOUT_SIZE_SMALL: params.height =(int) (HEIGHT_SMALL*size); break; } listView.setLayoutParams(params); }


Mira esto:

ListView ignorando wrap_content

Usando android: layout_height y android: layout_weight lo resolvió para mí:

<ListView android:layout_height="0dp" android:layout_weight="1" />


Puede hacer su propia vista de lista personalizada. (Puede extender ListView / ExpandableListView / GridView) y anular el método onMeasure con esto. Con esto, nunca necesitarás llamar a una función ni a nada. Solo úsalo en tu xml.

@Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }


Si alguien todavía tiene el problema, entonces puede hacer CustomList y agregar el método onMesure() tal como lo implementé:

public class ScrolleDisabledListView extends ListView { private int mPosition; public ScrolleDisabledListView(Context context) { super(context); } public ScrolleDisabledListView(Context context, AttributeSet attrs) { super(context, attrs); } public ScrolleDisabledListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { final int actionMasked = ev.getActionMasked() & MotionEvent.ACTION_MASK; if (actionMasked == MotionEvent.ACTION_DOWN) { // Record the position the list the touch landed on mPosition = pointToPosition((int) ev.getX(), (int) ev.getY()); return super.dispatchTouchEvent(ev); } if (actionMasked == MotionEvent.ACTION_MOVE) { // Ignore move events return true; } if (actionMasked == MotionEvent.ACTION_UP) { // Check if we are still within the same view if (pointToPosition((int) ev.getX(), (int) ev.getY()) == mPosition) { super.dispatchTouchEvent(ev); } else { // Clear pressed state, cancel the action setPressed(false); invalidate(); return true; } } return super.dispatchTouchEvent(ev); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }


Si desea una solución simple a este problema sin extender la clase ListView, esta es una solución para usted.

mListView.post(new Runnable() { @Override public void run() { int height = 0; for(int i = 0; i < mListView.getChildCount();i++) height += mListView.getChildAt(i).getHeight(); ViewGroup.LayoutParams lParams = mListView.getLayoutParams(); lParams.height = height; mListView.setLayoutParams(lParams); } });


Supongo que nadie ve esto. No puedo tener dos pergaminos en el mismo diseño. Primero tienes una vista de desplazamiento y luego tienes una lista, apuesto a que estás matando algunas de las buenas prácticas de Android.


Tenía un ListView en mi diseño y quería usar una biblioteca que no puede manejar un ListView aquí porque lo envuelve en un ScrollView . La mejor solución para mí se basa en la respuesta de Fedor.

Como ya tengo un ArrayAdapter para ListView , quería volver a usarlo:

LinearLayout listViewReplacement = (LinearLayout) findViewById(R.id.listViewReplacement); NamesRowItemAdapter adapter = new NamesRowItemAdapter(this, namesInList); for (int i = 0; i < adapter.getCount(); i++) { View view = adapter.getView(i, null, listViewReplacement); listViewReplacement.addView(view); }

Para mí, esto funciona bien porque solo necesito mostrar datos dinámicos que varían de 1 a 5 elementos. Solo tuve que agregar mi propio divisor.


Si todos los artículos tienen la misma altura

int totalItemsHeight = baseDictionaries.size() * item.getMeasuredHeight(); int totalDividersHeight = listView.getDividerHeight() * (baseDictionaries.size() - 1); int totalPadding = listView.getPaddingBottom() + listView.getPaddingTop(); LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) listTranslationWords.getLayoutParams(); lp.height = totalItemsHeight + totalDividersHeight + totalPadding; listTranslationWords.setLayoutParams(lp);