Android 是否在每个项目上都具有progressbar的listView?
我有一个listView,在每个项目上我都添加了一个progressBar,它需要在图像下载后消失。但是我找不到一个方法来做这件事。我试图让它在getView类中消失,但它并没有在下载图像后立即消失 例如,在AsyncTask类“DoInBackground”上向scrollView添加一些视图时,我可以下载图像,然后在PostExecute上设置图像,然后删除progressBar。这个很好用。我想为listView做类似的事情。有人能帮我吗 我不知道我是否清楚,但我可以总结一下,我有list_item.xml包含imageview和progressbar。我想让这些进度条在下载和设置图像后消失 谢谢你的帮助 这是我的适配器类:Android 是否在每个项目上都具有progressbar的listView?,android,listview,progress-bar,Android,Listview,Progress Bar,我有一个listView,在每个项目上我都添加了一个progressBar,它需要在图像下载后消失。但是我找不到一个方法来做这件事。我试图让它在getView类中消失,但它并没有在下载图像后立即消失 例如,在AsyncTask类“DoInBackground”上向scrollView添加一些视图时,我可以下载图像,然后在PostExecute上设置图像,然后删除progressBar。这个很好用。我想为listView做类似的事情。有人能帮我吗 我不知道我是否清楚,但我可以总结一下,我有list
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);
}