2011-10-27 22 views
5

Tengo una vista de lista con algunos elementos que se pueden marcar como "hecho". También hay un togglebutton que dice "ocultar elementos hechos".Android establece View.GONE no "libera" espacio en listview

Sin embargo, cuando lo haga ocultar los elementos mediante el establecimiento de setVisibility (View.GONE) todavía hay espacio dejado en la lista ..

No debería ser tan difícil de cambiar elementos de la lista en una vista de lista?

Respuesta

9

Cambiando el android: layout_height = "wrap_content" a android: layout_height = "fill_parent" corrigió el problema ... estaba probando con una larga lista ... con una lista corta el mismo espacio estaba sobre la lista .. Estúpido error.

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

+0

Felicitaciones por la solución. Cuando pueda, asegúrese de marcar su respuesta como 'aceptada' para que otros puedan aprender de su éxito. Cheers ~ –

+5

no funciona para fill parent. – Thushara

1

que debe operar en el adaptador lista también ...

+0

Este está todo en el adaptador de lista. –

3

¿Estás tratando de ocultar todo el elemento de la lista? Si es así, supongo que a la vista de lista no le gustará eso porque todavía está calculando con la misma cantidad de elementos. No creo que simplemente lo ignore porque ya no está.

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

+0

Por lo tanto, mantenga una lista por separado con todos los elementos marcados y solo trabaje con la lista necesaria para mostrar la información correcta. Suena como un plan. –

+0

No funciona en absoluto. Devuelvo el artículo correcto y el recuento correcto según el estado de alternar del botón. Los ítems de la lista son los ítems correctos, pero aún existe una gran brecha de espacios en blanco. ¿Podría ser que las clases de los poseedores aún estén allí? –

+0

'notifyDataSetChanged' activará la lista para llamar a' getView' para todos los elementos utilizando el valor devuelto 'getCount'. Esto debería funcionar. Pero no puedo ayudarte porque no conozco ningún detalle. Parece que hay algo más realmente equivocado ... – Knickedi

0

Pude resolver este problema usando la solución de Knickedi y los comentarios debajo. Solo quería mostrar mi adaptador relativamente completo para aclararlo un poco.

Tengo la clase StockItem con campos para contener un rango de datos para un solo artículo en inventario. 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, me hizo caso omiso de getView(), y getCount() para leer de una segunda lista (mFilteredList) producida utilizando 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 (cadena de búsqueda) se llama desde una OnQueryTextListener y elimina elementos de la lista cuyas descripciones no coinciden con el texto ingresado.

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

EDITAR: El método getItem (posición) también se debe anular para devolver el elemento de mFilteredList.

@Override 
public StockItem getItem(int position) { 

    return mFilteredList.get(position); 
} 
0

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

tenía dos cuestiones principales: 1) que tenía un espacio vacío debido a la vista que su visibilidad se establece ido 2) también tuve dividerHeight de 12DP, incluso si tuviera el primer número solucionado todavía tenía la altura divisor fijo de la vista de lista

Solución:

1.1) he añadido un valor lógico de los datos de la lista, para notificar el adaptador de cuál de los elementos se omiten

1.2) He creado un diseño vacío para simular un "saltado elemento"

<?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 puntos de vista en mi vista de lista, el elemento seleccionado, tema ordinario y ahora saltado elemento

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; 
    } 
única

Si el artículo se salta el adaptador de inflar a una composición vacía como se muestra en el paso anterior, todavía tenía el problema de altura divisor

2) para fijar la altura divisor he cambiado la altura del divisor a 0 en lugar de 12DP, cada elemento que no se salta, agregué otro diseño con fondo transparente (el color Divier en mi caso debe ser transparente) y se añade el relleno inferior 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 trabajado para mí