2013-10-03 1 views
4

J'utilise CursorAdapter personnalisé avec des éléments personnalisés. J'ai besoin de hauteur de vue pour redimensionner Bitmap à partir du dossier des actifs et définir cette bitmap redimensionnée à ImegeView dans l'élément de liste;Comment obtenir la hauteur de vue à l'intérieur de l'adaptateur pour créer un bitmap de taille?

@Override 
public void bindView(View view, final Context context, final Cursor cursor) { 
    final ViewHolder holder = (ViewHolder) view.getTag(); 

    final int imgCol = cursor.getColumnIndex(TableOdelice.COLUMN_URL); 
    int titleCol = cursor.getColumnIndex(TableOdelice.COLUMN_TITRE); 
    final int themeCol = cursor.getColumnIndex(TableOdelice.COLUMN_THEME); 

    String tempPath = getPath(cursor.getString(themeCol), cursor.getString(imgCol)); 
    final String path = tempPath.replace(".", "c."); 
    String[] arr = cursor.getString(titleCol).split("\\*"); 
    holder.title.setText(arr[0]); 
    holder.subTitle.setText(arr[1]); 

    if (itemHeight > 0) { 
     showThumb(itemHeight, holder.img, path); 
    } else { 
     final ImageView v = holder.mainImage; 
     v.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       itemHeight = v.getHeight(); 
       showThumb(itemHeight, holder.img, path); 
      } 
     }); 
    } 
} 

    private void showThumb(int height, final ImageView iv, final String path) { 
    if (thumbs.containsKey(path)) { 
     iv.setImageBitmap(thumbs.get(path)); 
    } else { 
     InputStream is = null; 
     try { 
      is = context.getAssets().open(path); 
     } catch (IOException e) { 
      Log.d("no file at path", path); 
      e.printStackTrace(); 
     } 
     if (is != null) { 
       Bitmap btm = btmHelper.scaleToHeight(BitmapFactory.decodeStream(is);, height); 
      thumbs.put(path, btm); 
      iv.setImageBitmap(btm); 

     } 
    } 

} 

Pour obtenir la hauteur de vue, j'utilise OnGlobalLayoutListener() of view.

Mais c'est très lent ... Des idées?

+0

'v.getLayoutParams(). Height' devrait fonctionner, je suppose –

+0

@Thijs Mergaert, ça ne marche pas et retourne toujours -1. Merci pour votre réponse –

Répondre

12

Je trouve réponse à ma question. En utilisant cette construction, j'obtiens une largeur ou hauteur de vue correcte à l'intérieur de l'adaptateur pour chaque vue.

final ImageView v = holder.mainImage; 
      v.post(new Runnable() { 
      @Override 
      public void run() { 
       itemHeight = v.getHeight(); 
       Log.d("Height", "" + itemHeight); 
      } 

     }); 
    } 

Peut-être que cela aidera quelqu'un :)

0

juste faire un essai peut être ce sera plus rapide

v.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      itemHeight = v.getHeight(); 
      showThumb(itemHeight, holder.img, path); 
      v.getViewTreeObserver().removeGlobalOnLayoutListener(ActivityInsatance); 
     } 
    }); 
+0

Ali4Android, j'ai besoin d'obtenir la hauteur de la vue à l'intérieur de l'adaptateur et iv.getHeight() retour toujours 0. Merci pour votre réponse et voir ce http://stackoverflow.com/a/11169602/1180477 –

+1

ru obtenir la hauteur exacte de votre imageview en utilisant v.getViewTreeObserver m – DropAndTrap

+0

oui v.getViewTreeObserver obtient la bonne taille, mais après un certain temps après la vue provoque la méthode onGlobalLayout() et il est moche –

0

Si vous avez des marges haut ou en bas, un bug apparaît. Lorsque vous faites défiler cette liste, une hauteur de chaque rangée augmentera. Dans le cas de v.getViewTreeObserver(). AddOnGlobalLayoutListener, il va croître à l'infini. Donc, ma solution suit. Où holder.layout est un lien vers la racine RelativeLayout de la ligne d'une carte.

Questions connexes