versiones pie oreo developer descargar android

android - pie - Vistas escondidas en RecyclerView



android pie (6)

Tengo un código como este

public static class MyViewHolder extends RecyclerView.ViewHolder { @InjectView(R.id.text) TextView label; public MyViewHolder(View itemView) { super(itemView); ButterKnife.inject(this, itemView); } public void hide(boolean hide) { label.setVisibility(hide ? View.GONE : View.VISIBLE); } }

que se asigna a una sola fila en un RecyclerView . R.id.text es, de hecho, la vista raíz del diseño que se infla y se pasa al constructor aquí.

Estoy usando la implementación predeterminada de LinearLayoutManager .

En bindViewHolder , bindViewHolder hide(true) en una instancia de MyViewHolder , pero en lugar de colapsar la fila como se esperaba, la fila se vuelve invisible, manteniendo su altura y posición en RecyclerView . ¿Alguien más se ha encontrado con este problema?

¿Cómo se ocultan los artículos en un RecyclerView?


¡Puedes hacerlo!

Primero, necesita detectar qué posición del elemento que desea ocultar. Puedes personalizar getItemViewType para hacerlo.

Luego, en onCreateViewHolder, depende del tipo de vista. Puedes hacer algo como esto:

if(viewType == TYPE_HIDE) { v = LayoutInflater.from(parent.getContext()).inflate(R.layout.empty_item, parent, false); vHolder = new ViewHolder(context, v, viewType, this); break; } return vHolder;

-> elemento vacío es un diseño que no tiene nada (en otras palabras, es diseño predeterminado siempre que se crea). o código:

<?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="match_parent" android:orientation="vertical"> </LinearLayout>

Espero que ayude!


Coloque el método setVisibility(boolean isVisible) en ViewHolder .

Puede cambiar los itemView (ancho y alto) para LayoutManager :

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ ... public void setVisibility(boolean isVisible){ RecyclerView.LayoutParams param = (RecyclerView.LayoutParams)itemView.getLayoutParams(); if (isVisible){ param.height = LinearLayout.LayoutParams.WRAP_CONTENT; param.width = LinearLayout.LayoutParams.MATCH_PARENT; itemView.setVisibility(View.VISIBLE); }else{ itemView.setVisibility(View.GONE); param.height = 0; param.width = 0; } itemView.setLayoutParams(param); } public ViewHolder(View itemView) { super(itemView); ... } }

y cambiar la visibilidad de ItemDecoration (Divider):

public class DividerItemDecoration extends RecyclerView.ItemDecoration { ... @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { ... for (int i = 0; i < parent.getChildCount(); i++) { if (parent.getChildAt(i).getVisibility() == View.GONE) continue; /* draw dividers */ } } }


De acuerdo, la forma en que lo hice al final fue tener todo mi conjunto de datos, por ejemplo, myObjects y yo teníamos escenarios en los que solo quería mostrar subconjuntos de ese conjunto de datos.

Como establecer la visibilidad de las filas en RecyclerView no hace que las alturas se colapsen, y al establecer las alturas de las filas tampoco pareció hacer nada, lo que tenía que hacer era mantener un conjunto de datos secundario llamado myObjectsShown que no era más que un List<Integer> que se myObjects en myObjects para determinar qué objetos se mostrarían.

Luego actualizaría myObjectsShown intermitentemente para contener los índices correctos.

Por lo tanto,

public int getItemCount() { return myObjectsShown.size(); }

y

public void onBindViewHolder(MyViewHolder holder, int position) { Object myObject = myObjects.get(myObjectsShown.get(position)); // bind object to viewholder here... }


En aras de la integridad, debe tener en cuenta que la configuración de la visibilidad de la vista en GONE no ocultará los márgenes. Debes hacer algo como esto:

if(itemView.getVisibility() != GONE) itemView.setVisibility(GONE); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) itemView.getLayoutParams(); layoutParams.setMargins(0, 0, 0, 0); itemView.setLayoutParams(layoutParams);


No hay una forma integrada de ocultar a un niño en RV pero, por supuesto, si su altura se convierte en 0, no será visible :). Supongo que el diseño de su raíz tiene una altura mínima (o una altura exacta) que hace que aún ocupe espacio, aunque esté DESPUESTO

Además, si desea eliminar una vista, elimínela del adaptador, no la oculte. ¿Hay alguna razón por la que quieras esconderte en lugar de eliminarla?


Para ocultar la vista en RecyclerView, oculto / muestro la vista en OnBindViewHolder :

if (item.isShown) { vh.FooterLayout.setVisibility(View.Visible); } else { vh.FooterLayout.setVisibility(View.Gone); }

Y, por ejemplo, de la actividad simplemente _postListAdapter.notifyItemChanged(position) elemento necesario: _postListAdapter.notifyItemChanged(position) // si quiere mostrar / ocultar el pie de página - la posición es amountOfPosts.size() y también cambia la variable bool - amountOfPosts[amountOfPosts.size()].isShown