programacion - manual de android en pdf
Android: cómo ocultar un elemento ListView (7)
¿Cómo se puede ocultar un elemento en un ListView o al menos establecer su altura a cero?
Intenté configurar la visibilidad de View to GONE pero aún mantiene el espacio del artículo (alto).
Creo que tengo una solución mucho más fácil / segura: solo tiene que "incrustar" su elemento en un Diseño, y cambiar la visibilidad de este diseño principal.
<?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>
Luego en tu código simplemente hazlo:
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 usa / reutiliza el mismo artículo, y simplemente lo oculta / muestra.
Cuando se trata de ListView, para hacerlo eficiente, utilizamos el patrón ViewHolder. La forma de usar ViewHolder Pattern 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) de la siguiente manera.
@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;
}
Realizamos la comprobación del tipo de Vista del elemento y si cumple con el control de ocultación, devolverá 1, de lo contrario 0. ListView sabe que habrá 2 tipos de Vista de getViewTypeCount. Ahora, getView devolverá la vista apropiada dependiendo de hideStatusCheck. Para hacer un ListView robusto, queremos usar el patrón ViewHolder. No necesitamos usar ViewHolder cuando está oculto. Simplemente inflemos R.layout.row_null y lo devolvemos. Usaremos ViewHolder para R.layout.normal_item. Aquí está la parte difícil asumiendo 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 vuelve a ser normal desde la ocultación. El tercer control en la última cláusula else
es comprobar si el ViewHolder retenido en la etiqueta es el ViewHolder correcto. Si se cumplen estas condiciones, siempre inflemos la vista nuevamente. Sí, es cierto que, el patrón ViewHolder no se usa en todas partes, pero se usa para ciertas extensiones. Es mejor que nada.
He visto el código fuente. Y solo hay una forma de ocultar un elemento sin notifyDataSetChanged()
. Debe establecer la visibilidad GONE
para todas las vistas internas y eliminar la imagen de fondo y los rellenos para la vista del elemento.
Nota: La fila con dicho elemento invisible será seleccionable.
PD: Esto es muy útil para ExpandableListView
si desea ocultar la vista de grupo por sí mismo.
Hice algunos retoques con una lista de arrastrar y soltar desde here . Cuando un elemento se saca de la lista para ser movido por el espacio de la celda que ocupa tiene su altura establecida en 1px (vea la línea 238) para que parezca "desaparecido". No pude encontrar una manera de manejar esto mejor ya que establecer la altura en 0 falla al igual que 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.
Reservé una vieja pregunta, pero acabo de tener este problema en el que quería ocultar elementos de la lista de forma temporal en función de criterios fuera de los datos de la lista. Lo que terminé haciendo fue crear un diseño de "elemento nulo" en xml y lo devolví en función de mis criterios en lugar de la vista de conversión 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>
agregar a su objeto ListView: android: dividerHeight = "0px" android: divider = "# FFFFFF"
El color del divisor no tiene importancia solo para establecer el divisor. La altura no funciona
Esto elimina el divisor aunque ...
si quieres ocultar el elemento de esta manera:
convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,1));
convertView.setVisibility(View.GONE);
no puede ser AbsListView.LayoutParams (-1,0);
Si la vista convertida se reutiliza, debe agregarla a continuación para restablecerla.
if(convertView.getVisibility() == View.GONE) {
convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT));
convertView.setVisibility(View.VISIBLE);
}