Picasso y adaptador con viewHolder
Tengo problemas con trabajar con Picasso. No puedo acceder a viewHolder de la clase Target. Y hay un problema con guardar las imágenes descargadas. ¿Puede alguien ayudarme ???? Por favor.
aquí hay un código de adaptador:
- Acercamiento a las imágenes de Android en DB
- Lenta Cargando imágenes grandes con Picasso
- Si Picasso repite la imagen cargando para siempre cuando no hay acceso a Internet
- Android - picasso muestra solo marcador de posición, no la imagen de URL
- Imágenes que no se cargan con Picasso sin error
public AsanasAdapter(List<Asana> asanaList, Context mContext){ this.mContext = mContext; this.asanaList = asanaList; this.layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return asanaList.size(); } @Override public Asana getItem(int position) { return asanaList.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder =null; if(convertView==null){ viewHolder = new ViewHolder(); convertView = layoutInflater.inflate(R.layout.asanas_item, null); viewHolder.asanaName = (TextView) convertView.findViewById(R.id.asana_name); viewHolder.asanaDesc = (TextView) convertView.findViewById(R.id.asana_desc); viewHolder.asanaImg = (ImageView) convertView.findViewById(R.id.asana_img); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } String name = getItem(position).getName(); String desc = getItem(position).getDescShort(); viewHolder.asanaDesc.setText(desc); viewHolder.asanaName.setText(name); final File imgFile = new File(Environment.getDataDirectory()+"/"+getItem(position).getId()+".png"); if(imgFile.exists()){ Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); viewHolder.asanaImg.setImageBitmap(myBitmap); } else if (isNetworkConnected()) { Log.d("MYLOGGGGGGGG", MYurl.BASE_URL + "/" + getItem(position).getImgThumb() + ""); final ViewHolder finalViewHolder = viewHolder; Picasso.with(mContext) .load(MYurl.BASE_URL + "/" + getItem(position).getImgThumb()) .into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { viewHolder File fPath = Environment.getDataDirectory(); File file = new File(fPath, getItem(position)+".png"); if (!file.exists()) { try { file.mkdirs(); file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } FileOutputStream out = null; try{ out = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG,100,out); } catch (Exception e){ e.printStackTrace(); } finally { try{ if (out != null){ out.close(); } } catch (IOException e){ e.printStackTrace(); } } } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } }); } else{ // viewHolder.asanaImg.setImageBitmap(); } return convertView; } public boolean isNetworkConnected() { ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = cm.getActiveNetworkInfo(); if (ni == null) { // There are no active networks. return false; } else return true; } static class ViewHolder { ImageView asanaImg; TextView asanaName; TextView asanaDesc; } }
- La biblioteca de Picasso no carga imágenes de la tarjeta SD en Android
- Uso de la biblioteca picasso con una vista de imagen circular
- Cómo agregar un token de autenticación en el encabezado de la biblioteca Picasso
- Cómo cargar diseño de fondo utilizando Picasso
- ¿Cómo optimizo mejor Picasso en un GridView?
- ¿Cómo lograr el seguimiento de la imagen de marcador de posición en ImageView Android como Pinterest?
- Glide - carga un solo fotograma del video en un momento específico?
- Picasso "Cambiar tamaño y centerCrop" o ImageView "centerCrop"?
Aquí crear una nueva clase de implementación Meta como:
public class MyTarget implements Target { ViewHolder holder; public MyTarget(ViewHolder holder){ this.holder = holder; } @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { }
}
y utilizarlo en su código como:
MyTarget target = new MyTarget(viewHolder) { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { //Use ViewHolder here File fPath = Environment.getDataDirectory(); File file = new File(fPath, getItem(position)+".png"); if (!file.exists()) { try { file.mkdirs(); file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } FileOutputStream out = null; try{ out = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG,100,out); } catch (Exception e){ e.printStackTrace(); } finally { try{ if (out != null){ out.close(); } } catch (IOException e){ e.printStackTrace(); } } } }; Picasso.with(mContext) .load(MYurl.BASE_URL + "/" + getItem(position).getImgThumb()) .into(target);
No se puede usar ViewHolder en la clase Target porque es una clase interna. Para tener acceso a ViewHolder, U puede tener que hacer que la variable ViewHolder sea una variable final. Espero que pueda ayudarte.
- Cómo cambiar la fecha en el dispositivo Android Things?
- Repetir la llamada API con retrofit y rxjava