【发布时间】:2015-03-27 12:37:17
【问题描述】:
我有一个带有GridView 和ImageViews 作为项目的片段。细胞数量在 25 个左右。
对于每个图像,我都有一个按 ID 的服务器请求。所以它有 25 个服务器请求。需要2-3秒。
如何一次接收一张图片并将其动态设置为单元格的内容? 每个单元格,还没有图片应该包含ProgressBar。
我现在有什么:我正在尝试加载 AsyncTask 中的项目并将 Bitmap 数组返回给 UI 线程。但我不知道如何为每个图像做到这一点。我的GridView 仅在所有图像下载后出现。它应该首先显示 25 个元素,其中包含 ProgressBars 并且没有图像。
代码
片段的onCreate():
@Override
public void onCreate(Bundle savedInstanceState) {
...
mItems = new Bitmap[dataChannelsList.size()];
try {
//starting AsyncTask
mItems = new LoadImageAsyncTask(dataChannelsList).execute().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
LoadImageAsyncTask:
private class LoadImageAsyncTask extends AsyncTask<Bitmap[], Void, Bitmap[]> {
private ArrayList<DataChannels> dataChannelsList;
private Bitmap[] bitmapList;
public LoadImageAsyncTask(ArrayList<DataChannels> dataChannelsList) {
this.dataChannelsList = dataChannelsList;
bitmapList = new Bitmap[dataChannelsList.size()];
}
protected void onPreExecute() {
super.onPreExecute();
}
protected Bitmap[] doInBackground(Bitmap[]... params) {
for (int i = 0; i < dataChannelsList.size(); i++) {
bitmapList[i] = getChannelImg(dataChannelsList.get(i).getId());
}
return bitmapList;
}
protected void onPostExecute(Bitmap[] param) {
super.onPostExecute(param);
}
private Bitmap getChannelImg(String id) {
...returns Bitmap image by id
}
}
GridView适配器:
public class GridViewAdapter extends BaseAdapter {
private Context mContext;
private Bitmap[] mItems;
public GridViewAdapter(Context context, Bitmap[] items) {
mContext = context;
mItems = items;
}
@Override
public int getCount() {
return mItems.length;
}
@Override
public Object getItem(int position) {
return mItems[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
// inflate the GridView item layout
LayoutInflater inflater = LayoutInflater.from(mContext);
convertView = inflater.inflate(R.layout.gridview_item, parent, false);
// initialize the view holder
viewHolder = new ViewHolder();
viewHolder.ivIcon = (ImageView) convertView.findViewById(R.id.imageview_channelIcon);
viewHolder.progressBar = (ProgressBar) convertView.findViewById(R.id.progress_bar_load_image);
convertView.setTag(viewHolder);
} else {
// recycle the already inflated view
viewHolder = (ViewHolder) convertView.getTag();
}
// update the item view
Bitmap item = mItems[position];
//hide progress bar and bring image to top
viewHolder.progressBar.setVisibility(View.GONE);
viewHolder.ivIcon.setImageBitmap(item);
return convertView;
}
}
private static class ViewHolder {
ImageView ivIcon;
ProgressBar progressBar;
}
伙计们,我真的需要你们的帮助。 告诉是否需要更多代码或解释。
【问题讨论】:
-
看看 Picasso stackoverflow.com/questions/22330772/…,或者至少回顾一下这样的开源解决方案来学习
-
你应该调用适配器的 imageLoaderTask onGetView() 方法。此外,您的加载程序任务下载应该由适配器使用您的 image_id 进行参数化和调用。
标签: android gridview android-fragments android-asynctask