У меня есть фрагмент с GridView
с ImageViews
в качестве предметов. Количество ячеек составляет около 25.Загрузите по одному товару за один раз от AsyncTask
Для каждого изображения у меня есть запрос сервера по идентификатору. Таким образом, его 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;
}
Ребята, мне очень нужна ваша помощь. Сообщите, требуется ли еще какой-либо код или объяснения.
проверить t Picasso http://stackoverflow.com/questions/22330772/why-use-android-picasso-library-to-download-images или, по крайней мере, рассмотреть решение с открытым исходным кодом, подобное этому, чтобы узнать – CSmith
Вы должны вызвать imageLoaderTask onGetView() метод адаптера. Также загрузку задачи загрузчика следует параметризовать и вызывать адаптером с помощью image_id. – kgnkbyl