Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: Cómo ocultar un elemento ListView

¿Cómo puede ocultar un elemento en un ListView o al menos establecer su altura a cero?

He intentado fijar la visibilidad de la visión a GONE pero todavía mantiene el espacio del artículo (altura).

  • Rellenar listview de arraylist de objetos
  • Setvisibility (view.visible) no funciona después de setvisibility (view.gone)
  • Android View con View.GONE sigue recibiendo onTouch y onClick
  • Animar modos de visibilidad, GONE y VISIBLE
  • Establecer programaticamente la visibilidad de fragmento de mapa google (API2)
  • 7 Solutions collect form web for “Android: Cómo ocultar un elemento ListView”

    Resurrecting una vieja pregunta, pero acabo de tener este problema donde quería ocultar los elementos de la lista temporalmente sobre la base de criterios fuera de los datos de la lista. Lo que acabé haciendo fue crear un "elemento nulo" de diseño en xml y devuelto que basado en mis criterios en lugar de convertir la vista en getView () …

    En lugar de devolver el convertView, devolví mi null_item …

    return inflater.inflate(R.layout.null_item, null); 

    Null_item.xml:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" > </LinearLayout> 

    Si desea ocultar el elemento como este:

     convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,1)); convertView.setVisibility(View.GONE); 

    No puede ser AbsListView.LayoutParams (-1,0);

    Si convertview se reúne debe agregar esto a continuación para configurar la altura de nuevo:

     if(convertView.getVisibility() == View.GONE) { convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT)); convertView.setVisibility(View.VISIBLE); } 

    Cuando se trata de ListView, para hacerlo eficiente, usamos el patrón ViewHolder. La forma de utilizar el patrón de ViewHolder y R.layout.row_null del siguiente xml

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" > </LinearLayout> 

    Es usar con getViewTypeCount () y getItemViewType (int position) como sigue.

      @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { return (hideStatusCheck(position)) ? 1 : 0; } @Override public View getView(int pos, View convertView, ViewGroup parent) { View rowView = convertView; if (hideStatusCheck(pos)) { if (rowView == null || rowView.getTag() != null) { LayoutInflater inflater = mActivity.getLayoutInflater(); rowView = inflater.inflate(R.layout.row_null, parent, false); } } else { if (rowView == null) { rowView = inflateNormalView(parent); } else if (rowView.getTag() == null) { rowView = inflateNormalView(parent); } else { ViewHolder holderToCheck = (ViewHolder) rowView.getTag(); Integer storedPos = (Integer) holderToCheck.getTag(POSITION); if (storedPos == null || storedPos != pos) rowView = inflateNormalView(parent); } ViewHolder holder = (ViewHolder) rowView.getTag(); holder.setTag(POSITION,pos); /* Populate data */ return rowView; } private View inflateNormalView(ViewGroup parent) { View rowView; LayoutInflater inflater = mActivity.getLayoutInflater(); rowView = inflater.inflate(R.layout.normal_item, parent, false); ViewHolder viewHolder = new ViewHolder(); assert rowView != null; /* Initiate normal findViewById thing*/ rowView.setTag(viewHolder); return rowView; } 

    Hacemos la comprobación del tipo de vista del elemento y si cumple con la verificación de ocultar, devolverá 1, de lo contrario 0. El ListView sabe que habrá 2 tipos de Vista de getViewTypeCount. Ahora, el getView devolverá el apprunote View dependiendo del hideStatusCheck. Para hacer un ListView robusto, queremos usar el patrón ViewHolder. No necesitamos usar ViewHolder cuando está oculto. Simplemente inflaremos el R.layout.row_null y lo devolveremos. Utilizaremos ViewHolder para el objeto R.layout.normal_item. Aquí está la parte difícil suponiendo que el cheque de ocultación no es estático. La primera comprobación de rowView==null es estándar. La segunda comprobación de rowView.getTag()==null es ver si la vista está volviendo a la normalidad desde ocultar. La tercera comprobación de la última cláusula else es comprobar si el ViewHolder retenido en la etiqueta es el ViewHolder adecuado. Si se cumplen estas condiciones, siempre inflaremos de nuevo la vista. Sí, es cierto que, el patrón ViewHolder no se utiliza en todo, pero se utiliza a ciertas se extiende. Es mejor que nada.

    Hice algunos ajustes con una lista de arrastrar y soltar desde aquí . Cuando un elemento se extrae de la lista que se mueve alrededor del espacio de la celda que ocupó tiene su altura establecida en 1px (véase la línea 238) por lo que parece "ido". No pude encontrar una manera de manejar esto mejor como la configuración de altura a 0 falla como lo hace la visibilidad GONE.

    Dicho esto, si realmente desea deshacerse de una fila menos temporalmente, podría ser una buena idea cambiar el respaldo del Adapter y llamar a notifyDataSetChanged() en él.

    He mirado el código fuente. Y sólo hay una manera de ocultar el elemento sin notifyDataSetChanged() . Debe establecer la visibilidad GONE para todas las vistas internas y quitar la imagen de fondo y los rellenos para la vista del elemento.

    Nota: La fila con ese elemento invisible será seleccionable.

    PS: Esto es muy útil para ExpandableListView si quieres ocultar la vista de grupo auto.

    Agregue a su objeto ListView: android: dividerHeight = "0px" android: divider = "# FFFFFF"

    El color del divisor no importa sólo el ajuste dividerHeight no funciona

    Esto quita el divisor sin embargo …

    Creo que tengo una solución mucho más fácil / más segura: sólo tiene que "incrustar" su elemento en un Layout, y cambiar la visibilidad de este diseño de los padres.

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <!-- Embed ListView Item into a "parent" Layout --> <LinearLayout android:id="@+id/parentLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <!-- This is the normal content of your ListView Item --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="World" /> </LinearLayout> </LinearLayout> 

    Entonces en tu código haz lo siguiente:

     public View getView(int position, View view, ViewGroup parent) { if (view == null) { LayoutInflater li = mActivity.getLayoutInflater(); view = li.inflate(R.layout.my_listview_item, null); } LinearLayout parentLayout = (LinearLayout) view.findViewById(R.id.parentLayout); if (shouldDisplayItem(position)) { parentLayout.setVisibility(View.VISIBLE); } else { parentLayout.setVisibility(View.GONE); } return view; } 

    De esta manera siempre utilizas / reutilizas el mismo elemento, y solo ocultarlo / mostrarlo.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.