2012-05-11 20 views
5

私はlistViewを持っているし、すべての項目に私は画像がダウンロードされた後に消える必要があるprogressBarを追加しました。しかし、私はこれを行う方法を見つけることができませんでした。私はそれをgetViewクラスで消えるようにしようとしましたが、イメージをダウンロードした直後ではなくすぐに消えます。listViewすべてのアイテムにプログレスバーがありますか?

たとえば、AsyncTaskクラスのDoInBackgroundでscrollViewにいくつかのビューを追加していて、イメージをダウンロードしてからonPostExecuteを実行してイメージを設定し、progressBarを削除できました。これはうまく動作します。私はlistViewのためにこのようなことをしたい。誰か助けてくれますか?

私は明確かどうか分かりませんが、私はlist_item.xmlにimageviewとprogressbarが含まれていることを要約できます。そして、私はダウンロードしてイメージを設定した後にこれらのプログレスバーを消したいと思っています。

ありがとうございました。

ここに私のアダプタクラスです:

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

ので、以下この行に、私は、プログレスバーが消えていますが、画像をダウンロードして設定した後、それがなくなってしなければならない作る...しかし、リスト項目に加えますプログレスバーはありません、それは私の問題ですか?

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

あなたは私たちに好意を持って、あなたの周りにあるコードを表示して、より良くあなたを助けることができますか? – Moiz

+0

あなたが望むコードで質問を更新しました... – yahya

答えて

4

あなたはこのようにすることができますが、それはベストプラクティスではありません。スレッド同期を自分で確認する必要があります。ビットマップはLruCacheまたはWeakRefrencesを使用してキャッシュします。デモでは論理​​のみが表示されます。

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

論理を得ました、ありがとうございます:) – yahya

1

これはあなたの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> 

と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); 
} 

スーパーを呼び出しますならば、それは、あなたのための他のビューの値を設定しますでした。ArrayList<HashMap<?, ?>>

これがすべてです。

+0

Oportunidadeとは何ですか? –

+0

getおよびsetを持つモデルオブジェクト – jlccaires

関連する問題