2011-12-01 7 views
5

Tengo un ListView dentro de la cual me dynamicaly llenar los elementos de la lista en el método getView(), con una combinación de TextView, y un ImageView.Android: calcular el tamaño de la vista en el interior MyAdapter :: getView

Necesito calcular el tamaño de la vista de texto e imagen dentro de getView, así que podré establecer visibility=gone, si la vista es demasiado grande. Tring:

public View getView(int position, View convertView, ViewGroup parent) { 
    .. 
    View listItem=view.findViewById(R.id.listItem); 
    ImageView imageView=(ImageView)view.findViewById(R.id.myImg); 
    TextView textView=(TextView)view.findViewById(R.id.mytxt); 
    if (imageView.getRight()>listItemText.getRight()) { 
    imageView.setVisibility(View.GONE); 
    } 
    if (textView.getRight()>listItemText.getRight()) { 
    textView.setVisibility(View.GONE);  
    } 
    .. 
} 

Sin embargo, desde que estoy en el interior del getView(), los valores de diseño aún no están creadas, por lo que obtener falsos valores de la llamada View.getRight().

¿Alguna idea de cómo hacer esto?

+0

¿Por qué no decides que de acuerdo con la longitud de la Cadena que vas a colocar dentro de TextView? – Thommy

+0

porque la misma longitud de texto puede tener un ancho real diferente – Tomer

+0

¿Qué le parece calcular el ancho completo y restar el ancho de ListItemtext? Si su contenido de vista de texto y contenido de vista de imagen es lo suficientemente pequeño para ese ancho en particular. Muévelo u ocúltelo. Solo una pregunta curiosa ¿no puedes elipsiar el texto y escalar la imagen para que siempre se muestre? –

Respuesta

0

Si realmente necesita hacer tal cosa, puede registrar un onLayoutChangeListener y escuchar los cambios en los parámetros de diseño, como izquierda, derecha, arriba y abajo.

textView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
      @Override 
      public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
       // TODO: Take care of visibility here. You can access the parent View by v.getParent() method. 
      } 
     }); 

Pero no se supone que hacer tal cosa en el método getView. Puede hacer textView multiline o establecer android:ellipsize="marquee" en el diseño de textView. Más sobre marquesina: Marquee text in Android

Cuestiones relacionadas