2012-05-11 13 views
5

Tengo una lista de visualización y en cada elemento agregué una barra de progreso que debe desaparecer después de que se descargó la imagen. Pero no pude encontrar una manera de hacer esto. Traté de hacerlo desaparecer en la clase getView, pero desaparece inmediatamente después de descargar la imagen.lista ¿Ver con la barra de progreso en cada elemento?

Por ejemplo, mientras agregaba algunas vistas a scrollView en una clase AsyncTask 'DoInBackground podía descargar una imagen y luego onPostExecute podría establecer una imagen, y luego eliminar progressBar. Esto funciona bien. Quiero hacer algo como esto para listView. ¿Alguien podría ayudarme?

No sé si estaba claro o no, pero puedo resumir que tengo list_item.xml contiene imageview y progressbar en él. Y quiero hacer que estas barras de progreso desaparezcan después de descargarlas y establecerlas.

Gracias por su ayuda.

Aquí es mi clase de adaptador:

class myListAdapter extends ArrayAdapter<Items> { 

    private ArrayList<Items> items; 
    private Context ctx; 

    public myListAdapter(Context context, int textViewResourceId, 
      ArrayList<Items> items) { 
     super(context, textViewResourceId, items); 
     this.ctx = context; 
     this.items = items; 
    } 

    @Override 
    public int getCount() { 
     return items.size(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 

     if (v == null) { 
      LayoutInflater inf = (LayoutInflater) ctx 
        .getSystemService(LAYOUT_INFLATER_SERVICE); 
      v = inf.inflate(R.layout.main_list_item, null); 
     } 

     Items index = listContents.get(position); 

     if (index != null) { 

      ImageView img = (ImageView) v.findViewById(R.id.listImage); 
      TextView title = (TextView) v.findViewById(R.id.listTopText); 
      TextView content = (TextView) v.findViewById(R.id.listDownText); 

      if (title != null) 
       title.setText(index.getTitle()); 

      if (content != null) 
       content.setText(index.getContent()); 

      if (img != null) 
       img.setImageBitmap(index.getImageBitmap()); 
      ((ProgressBar) v.findViewById(R.id.listItemProgressBar)).setVisibility(View.GONE); 

     } 

     return v; 
    } 
} 

Por lo tanto, en esta línea a continuación, hago que la barra de progreso ha ido pero debe desaparecer después de descargar la imagen y la puse ... Pero en artículos de la lista Agregado existe no hay barras de progreso, ese es mi problema?

((ProgressBar) v.findViewById(R.id.listItemProgressBar)).setVisibility(View.GONE); 
+1

¿puedes hacernos un favor y mostrarnos el código que tienes para que podamos ayudarte mejor? – Moiz

+0

Pregunta actualizada con los códigos que desea ... – yahya

Respuesta

4

Puede hacer esto, pero no es la mejor práctica. deberías verificar el Thread-Sync por ti mismo. y Cache el mapa de bits usa LruCache o WeakRefrences. la demostración solo muestra la lógica.

final class MyAdapter extends BaseAdapter { 

    private final HashMap<String, Bitmap> mImageMap; 
    private final HashSet<String> mDownloadingSet; 

    public MyAdapter() { 
     mImageMap = new HashMap<String, Bitmap>(); 
     mDownloadingSet = new HashSet<String>(); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return NUMBER_YOU_WANT; 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public void setImage(String url, Bitmap bitmap) { 
     mDownloadingSet.remove(url); 
     if (bitmap != null) { 
      mImageMap.put(url, bitmap); 
      notifyDataSetChanged(); 
     } 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = getLayoutInflater().inflate(R.layout.grid_view, 
        parent, false); 
      holder = new ViewHolder(); 

      /*** 
      * find the views. 
      */ 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     final String url = "";// Get the image url here. 

     if (mImageMap.containsKey(url)) { 
      holder.image.setImageBitmap(mImageMap.get(url)); 
      holder.progressBar.setVisibility(View.GONE); 
     } else { 
      holder.image.setImageResource(R.drawable.img_downloading); 
      holder.progressBar.setVisibility(View.VISIBLE); 
      if (!mDownloadingSet.contains(url)) { 
       ImageDownloader task = new ImageDownloader(); 
       mDownloadingSet.add(url); 
       task.execute(url); 
      } 

     } 

     return convertView; 
    } 
} 

static class ViewHolder { 
    ImageView image; 
    ProgressBar progressBar; 
} 

final class ImageDownloader extends AsyncTask<String, Void, Bitmap> { 

    String url; 

    @Override 
    protected Bitmap doInBackground(String... params) { 
      url = params[0]; 
     final Bitmap bitmap = fetchUrlAndDecode(params[0]); 
     return bitmap; 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     mAdapter.setImage(url, result); 
    } 

    private Bitmap fetchUrlAndDecode(String url) { 
     Bitmap bitmap = null; 

     /** 
     * Fetch your bitmap and decode it. 
     */ 

     return bitmap; 
    } 

} 
+0

Tengo la lógica, muchas gracias :) – yahya

1

Este es el código XML:

<RelativeLayout 
    android:layout_width="50dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:paddingLeft="5dp" > 

    <ProgressBar 
     android:id="@+id/progress" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="40dp" 
     android:layout_below="@+id/text_progress" 
     android:indeterminate="false" 
     android:layout_centerInParent="true" 
     android:progress="50" 
     android:max="100" /> 

    <TextView 
     android:id="@+id/text_progress" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:textColor="#000" 
     android:textStyle="bold" 
     android:textSize="15dp" 
     android:text="0%"/> 

</RelativeLayout> 

y reemplazar el método getView #:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View vi = convertView; 
    if (vi == null) 
     vi = inflater.inflate(R.layout.oportunidade_item_list, null); 

    ProgressBar title = (ProgressBar) vi.findViewById(R.id.progress); 
    title.setProgress(Integer.parseInt(((Oportunidade) get(position)).getProbabilidade())); 
    return super.getView(position, vi, parent); 
} 

llamando al súper, fijará los valores de otros puntos de vista para usted, si usted lo hizo con ArrayList<HashMap<?, ?>>

Eso es todo;

+0

¿Qué es Oportunidade? –

+0

Un objeto modelo con get y conjuntos – jlccaires

Cuestiones relacionadas