Android 是否在每个项目上都具有progressbar的listView?

Android 是否在每个项目上都具有progressbar的listView?,android,listview,progress-bar,Android,Listview,Progress Bar,我有一个listView,在每个项目上我都添加了一个progressBar,它需要在图像下载后消失。但是我找不到一个方法来做这件事。我试图让它在getView类中消失,但它并没有在下载图像后立即消失 例如,在AsyncTask类“DoInBackground”上向scrollView添加一些视图时,我可以下载图像,然后在PostExecute上设置图像,然后删除progressBar。这个很好用。我想为listView做类似的事情。有人能帮我吗 我不知道我是否清楚,但我可以总结一下,我有list

我有一个listView,在每个项目上我都添加了一个progressBar,它需要在图像下载后消失。但是我找不到一个方法来做这件事。我试图让它在getView类中消失,但它并没有在下载图像后立即消失

例如,在AsyncTask类“DoInBackground”上向scrollView添加一些视图时,我可以下载图像,然后在PostExecute上设置图像,然后删除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;
    }
}

你可以这样做,但这不是最好的做法。你应该自己检查线程同步。并使用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;
    }

}
final类MyAdapter扩展了BaseAdapter{
私有最终HashMap-mImageMap;
私有最终哈希集mDownloadingSet;
公共MyAdapter(){
mImageMap=newhashmap();
mDownloadingSet=newhashset();
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回您想要的号码;
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回0;
}
公共void setImage(字符串url、位图){
mDownloadingSet.remove(url);
if(位图!=null){
mImageMap.put(url、位图);
notifyDataSetChanged();
}
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=GetLayoutFlater()。充气(R.layout.grid_视图,
父母,假);
holder=新的ViewHolder();
/***
*查找视图。
*/
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
最终字符串url=”“;//在此处获取图像url。
if(mImageMap.containsKey(url)){
holder.image.setImageBitmap(mImageMap.get(url));
holder.progressBar.setVisibility(View.GONE);
}否则{
holder.image.setImageResource(R.drawable.img_下载);
holder.progressBar.setVisibility(视图可见);
如果(!mDownloadingSet.contains(url)){
ImageDownloader任务=新建ImageDownloader();
mDownloadingSet.add(url);
task.execute(url);
}
}
返回视图;
}
}
静态类视窗夹{
图像视图图像;
ProgressBar ProgressBar;
}
最终类ImageDownloader扩展了异步任务{
字符串url;
@凌驾
受保护位图doInBackground(字符串…参数){
url=params[0];
最终位图=fetchUrlAndDecode(参数[0]);
返回位图;
}
@凌驾
受保护的void onPostExecute(位图结果){
setImage(url、结果);
}
私有位图fetchUrlAndDecode(字符串url){
位图=空;
/**
*获取位图并对其进行解码。
*/
返回位图;
}
}
这是您的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>

调用super,它将为您设置其他视图的值,如果您使用
ArrayList,您可以帮我们一个忙,并向我们展示您拥有的代码,以便我们可以更好地帮助您吗?使用您希望的代码更新问题…带有get和set的模型对象
 <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>
@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);
}