I have a fragment with GridView
with ImageViews
as items. The amount cells is around 25.
For every Image I have a server request by Id. So its 25 server requests. Takes 2-3 seconds.
How can I receive one image at a time and dynamically set it as content of cell? And every cell, which doesn't have image yet should contain ProgressBar
.
What do I have now: I'm trying to load items in AsyncTask
and return Bitmap
array back to UI thread. But I don't know how to do that for every Image. My GridView
appears only after ALL images downloaded. And it should be visible first with 25 elements which contain ProgressBars
and no Images.
Code code
fragment's 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
adapter:
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;
}
Guys, I really need your help. Tell if some more code or explanations needed.