El conjunto de Android View.GONE no libera espacio en listview

Tengo una lista con algunos elementos que se pueden marcar como "hecho". También hay un togglebutton que dice "hide done items".

Sin embargo, cuando hago ocultar los elementos estableciendo setVisibility (View.GONE) todavía queda espacio en la lista.

¿No debería ser tan difícil de alternar los elementos de la lista en un listview?

Cambiar el androide: layout_height = "wrap_content" a android: layout_height = "fill_parent" arregló el problema .. estaba probando con una larga lista .. con una lista corta el mismo espacio estaba por encima de la lista .. Stupid error ..

Gracias a todos por la ayuda .. todo está funcionando ahora.

¿Está intentando ocultar el elemento de lista completo? Si es así supongo que la vista de lista no le gustará porque sigue calculando con la misma cantidad de elementos. No creo que simplemente lo ignorará porque se ha ido.

La solución limpia sería devolver otro getCount y simplemente ignorar los elementos que desea ocultar. O bien, elimine elementos de la lista interna utilizada. Llame a notifyDataSetChanged en el adaptador cuando modificó la cantidad de elementos de la lista.

Usted debe funcionar en el adaptador de la lista también …

Pude resolver este problema usando la solución de Knickedi y los comentarios bajo él. Sólo quería mostrar mi adaptador relativamente completo para aclarar un poco.

Tengo la clase StockItem con los campos para sostener una gama de datos para un solo artículo común. Para el ArrayAdapter personalizado, el constructor toma la lista completa de StockItems recuperados de una tabla de base de datos, y cualquier método de agregar / quitar que pueda agregar en el futuro también operará en esta lista (mList). Sin embargo, he superado getView (), y getCount () para leer de una segunda lista (mFilteredList) producido usando el método filterList ():

 public class StockItemAdapter extends ArrayAdapter<StockItem> { ... ArrayList<StockItem> mList; ArrayList<StockItem> mFilteredList; public StockItemAdapter(Context context, int resource, ArrayList<StockItem> list) { super(context, resource, list); ... mList = list; mFilteredList = list; } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; StockItemHolder holder = null; if (row == null) { LayoutInflater inflater = ((Activity)mContext).getLayoutInflater(); row = inflater.inflate(mResource, parent, false); holder = new StockItemHolder(); holder.imageView = (ImageView)row.findViewById(R.id.imageView); ... row.setTag(holder); } else { holder = (StockItemHolder)row.getTag(); } StockItem stockItem = mFilteredList.get(position); if (stockItem.getImage() != null) { holder.imageView.setImageBitmap(stockItem.getImage()); } else { holder.imageView.setImageResource(R.drawable.terencephilip); } ... return row; } @Override public int getCount() { return mFilteredList.size(); } static class StockItemHolder { ImageView imageView; ... } public void filterList(String search) { mFilteredList = new ArrayList<StockItem>(); for (StockItem item : mList) { if (item.getDescription().toLowerCase(Locale.ENGLISH) .contains(search.toLowerCase(Locale.ENGLISH))) { mFilteredList.add(item); } } notifyDataSetChanged(); } } 

FilterList (String search) se llama desde un OnQueryTextListener y elimina los elementos de la lista cuyas descripciones no coinciden con el texto introducido.

En el caso de una lista grande, filterList () puede ser un problema en el hilo principal, pero eso es irrelevante para esta pregunta.

EDIT: El método getItem (posición) también debe ser reemplazado para devolver el elemento desde mFilteredList.

 @Override public StockItem getItem(int position) { return mFilteredList.get(position); } 

Después de comprobar muchas soluciones ninguna de las cuales se resolvió mi problema con el espacio vacío, así que decidí que se me ocurrió la solución.

Tenía dos problemas principales: 1) Tenía un espacio vacío debido a la visión que fijé su visibilidad a ido 2) También tenía dividerHeight de 12dp, incluso si tenía el primer problema resuelto todavía tenía la altura fija del divisor del vista de la lista

Solución:

1.1) He añadido un booleano a los datos de la lista, para notificar al adaptador cuáles de los elementos se saltan

1.2) He creado una disposición vacía para simular un "artículo omitido"

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="0dp" android:layout_height="0dp"/> 

1.3) Tengo varios tipos de vistas en mi listview, el artículo seleccionado, el artículo regular y ahora saltó el artículo

  public class AdvancedTestAdapter extends BaseAdapter { private static final int REGULAR_STEP = 0; private static final int SELECTED_STEP = 1; private static final int SKIPPED_STEP = 2; private static final int TYPE_MAX_COUNT = 3; private List<AdvancedTestData> _data; private Context _context; private Typeface _fontTypeFace; public AdvancedTestAdapter(Context context, List<AdvancedTestData> data) { _context = context; _data = data; _fontTypeFace = Typeface.createFromAsset(_context.getResources().getAssets(), Consts.Fonts.UniversLTStdBoldCn); } @Override public AdvancedTestData getItem(int position) { return _data.get(position); } @Override public int getCount() { return _data.size(); } @Override public long getItemId(int position) { return 0; } @Override public int getItemViewType(int position) { AdvancedTestData step = getItem(position); if(step.isSkipped()) { return SKIPPED_STEP; } return _data.get(position).isStepSelected() ? SELECTED_STEP : REGULAR_STEP; } @Override public int getViewTypeCount() { return TYPE_MAX_COUNT; } @Override public View getView(int position, View convertView, ViewGroup parent) { RegularViewHolder regHolder; SelectedViewHolder selectHolder; AdvancedTestData item = getItem(position); int currentStepType = getItemViewType(position); switch (currentStepType) { case SKIPPED_STEP: convertView = LayoutInflater.from(_context).inflate(R.layout.skipped_item_layout, parent, false); break; case REGULAR_STEP: if (convertView == null) { regHolder = new RegularViewHolder(); convertView = LayoutInflater.from(_context).inflate(R.layout.advanced_test_layout, parent, false); regHolder._regTestUpperHeader = (TextView) convertView.findViewById(R.id.advanced_test_upper_name); regHolder._regTestLowerHeader = (TextView) convertView.findViewById(R.id.advanced_test_lower_name); regHolder._regTestImage = (ImageView) convertView.findViewById(R.id.advanced_test_image); regHolder._regTestWithoutLowerHeader = (TextView) convertView.findViewById(R.id.step_without_lower_header); regHolder._regTestUpperHeader.setTypeface(_fontTypeFace); regHolder._regTestLowerHeader.setTypeface(_fontTypeFace); regHolder._regTestWithoutLowerHeader.setTypeface(_fontTypeFace); convertView.setTag(regHolder); } else { regHolder = (RegularViewHolder) convertView.getTag(); } String upperHeader = item.getTestUpperHeader(); String lowerHeader = item.getTestLowerHeader(); if(lowerHeader.isEmpty()) { regHolder._regTestUpperHeader.setVisibility(View.GONE); regHolder._regTestLowerHeader.setVisibility(View.GONE); regHolder._regTestWithoutLowerHeader.setVisibility(View.VISIBLE); regHolder._regTestWithoutLowerHeader.setText(upperHeader); } else { regHolder._regTestUpperHeader.setVisibility(View.VISIBLE); regHolder._regTestLowerHeader.setVisibility(View.VISIBLE); regHolder._regTestWithoutLowerHeader.setVisibility(View.GONE); regHolder._regTestUpperHeader.setText(upperHeader); regHolder._regTestLowerHeader.setText(lowerHeader); } regHolder._regTestImage.setBackgroundResource(item.getResourceId()); break; case SELECTED_STEP: if (convertView == null) { selectHolder = new SelectedViewHolder(); convertView = LayoutInflater.from(_context).inflate(R.layout.advanced_selected_step_layout, parent, false); selectHolder._selectedTestName = (TextView) convertView.findViewById(R.id.selected_header_text); selectHolder._selectedTestDesc = (TextView) convertView.findViewById(R.id.selected_desc_text); selectHolder._selectedPreFinishControllers = (RelativeLayout) convertView.findViewById(R.id.prefinish_step_controllers); selectHolder._selectedFvEndControllers = (RelativeLayout) convertView.findViewById(R.id.advanced_fv_controllers); selectHolder._selectedNvEndControllers = (RelativeLayout) convertView.findViewById(R.id.advanced_nv_controllers); convertView.setTag(selectHolder); } else { selectHolder = (SelectedViewHolder) convertView.getTag(); } selectHolder._selectedPreFinishControllers.setVisibility(View.INVISIBLE); selectHolder._selectedFvEndControllers.setVisibility(View.INVISIBLE); selectHolder._selectedNvEndControllers.setVisibility(View.INVISIBLE); int testIndex = item.getTestIndex(); ADVANCED_QUICK_TEST_TESPS currentStep = ADVANCED_QUICK_TEST_TESPS.valueOf(testIndex); //show action buttons in each step in advanced mode switch (currentStep) { case QUESTIONS://nothing to show break; case RIGHT_VERIFICATION: case LEFT_VERIFICATION: case BINOCULAR_BALANCE: case SPHERE_VERIFICATION: case ADD_VERIFICATION: if(item.isStepPreFinished()) { selectHolder._selectedPreFinishControllers.setVisibility(View.VISIBLE); } break; case RIGHT_VA: case LEFT_VA: case BINO_VA: selectHolder._selectedPreFinishControllers.setVisibility(View.VISIBLE); break; case FV_DONE: selectHolder._selectedFvEndControllers.setVisibility(View.VISIBLE); break; case FULL_EXAM_DONE: selectHolder._selectedNvEndControllers.setVisibility(View.VISIBLE); break; } String textHeader = String.format("%s\n%s", item.getTestUpperHeader(),item.getTestLowerHeader()); selectHolder._selectedTestName.setText(textHeader); selectHolder._selectedTestDesc.setText(item.getTestDescription()); break; } return convertView; } public void setData(List<AdvancedTestData> data) { _data = data; notifyDataSetChanged(); } public static class RegularViewHolder { public TextView _regTestWithoutLowerHeader; public TextView _regTestUpperHeader; public TextView _regTestLowerHeader; public ImageView _regTestImage; } public static class SelectedViewHolder { public TextView _selectedTestName; public TextView _selectedTestDesc; public RelativeLayout _selectedPreFinishControllers; public RelativeLayout _selectedFvEndControllers; public RelativeLayout _selectedNvEndControllers; } 

Sólo si el elemento se omite el adaptador se infla a un diseño vacío como se muestra en el paso anterior, todavía tuve la cuestión de la altura del divisor

2) Para fijar la altura del divisor cambié la altura del divisor a 0 en vez de 12dp, cada artículo que no se saltó agregué otra disposición con el fondo transparente (el color divier en mi caso debe ser transparente) y el relleno inferior añadido de 12dp

Por ejemplo uno de mis artículos

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="vertical" android:paddingBottom="12dp" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/quick_test_background_selector" > <ImageView android:id="@+id/advanced_test_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/done_step" /> <TextView android:id="@+id/advanced_test_upper_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginLeft="5dp" android:layout_toRightOf="@id/advanced_test_image" android:gravity="center_vertical" android:text="ETAPE 1" android:textColor="@android:color/black" android:textSize="14sp" android:textStyle="bold" /> <TextView android:id="@+id/advanced_test_lower_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignBottom="@id/advanced_test_image" android:layout_marginLeft="5dp" android:layout_toRightOf="@id/advanced_test_image" android:gravity="center_vertical" android:text="ETAPE 1" android:textColor="@android:color/black" android:textSize="14sp" android:textStyle="bold" /> <TextView android:id="@+id/step_without_lower_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignBottom="@id/advanced_test_image" android:layout_alignTop="@id/advanced_test_image" android:layout_centerVertical="true" android:layout_marginLeft="5dp" android:layout_toRightOf="@id/advanced_test_image" android:gravity="center_vertical" android:text="123" android:textColor="@android:color/black" android:textSize="14sp" android:textStyle="bold" /> </RelativeLayout> </RelativeLayout> 

Quizás no es elegante pero esta solución funcionó para mí

  • No se puede cargar una imagen desde la URL
  • El clic de GridView no funciona dentro de la vista de lista personalizada
  • Listview y CustomAdapter que amplían SimpleCursorAdapter
  • Cómo filtrar ListView a través de EditText
  • Cómo agregar EditText en listview y obtener su valor dinámicamente en todas las filas?
  • Aceleración de hardware en ListView
  • ListView addHeaderView hace que la posición aumente en uno?
  • ¿Es posible desactivar scroll en un listView?
  • Android paginada lista sin fin no funciona
  • Iniciar un fragmento de diálogo en el botón de clic de un adaptador de base personalizado> getView
  • Utilizando una casilla de verificación con un enfoque en blanco falso, impide que los clics de vista de lista
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.