解析 - 将图像加载到GridView中
问题描述:
所以我试图加载我的Parse服务器上的一些缩略图,但它不是很有效。解析 - 将图像加载到GridView中
我遇到的问题是在将图像加载到GridView的for循环之外。出于某种原因,位图未被添加到列表中。
这里是我的代码:
private void getUserThumbs(){
Log.i("thumbs", "ThumbnailsFragment executed.");
thumbItemsList = new ArrayList<ThumbnailItems>();
final String userObjectID = ProfileActivity.objectID;
ParseQuery<ParseUser> query = ParseUser.getQuery();
query.getInBackground(userObjectID, new GetCallback<ParseUser>() {
@Override
public void done(ParseUser parseUser, ParseException e) {
if (e == null) {
try {
ParseQuery<ParseObject> postQuery = new ParseQuery<ParseObject>(
"Post");
postQuery.whereEqualTo("user", parseUser);
postQuery.orderByDescending("createdAt");
objectList = postQuery.find();
for (ParseObject parseObject : objectList) {
final ThumbnailItems thumbItems = new ThumbnailItems();
ParseFile image = (ParseFile) parseObject.get("image");
if (image != null) {
image.getDataInBackground(new GetDataCallback() {
@Override
public void done(byte[] bytes, ParseException e) {
if (e == null) {
Bitmap userImage = BitmapFactory.decodeByteArray(bytes, 0
, bytes.length);
thumbItems.setThumb(userImage);
} else {
Log.d("ParseException", "Error: " + e.getMessage());
e.printStackTrace();
}
}
});
}
thumbItemsList.add(thumbItems);
}
gridViewAdapter = new GridViewAdapter(getContext()
, thumbItemsList);
gridView.setAdapter(gridViewAdapter);
swipeRefreshLayout.setRefreshing(false);
} catch (ParseException e1) {
e1.printStackTrace();
}
} else {
e.printStackTrace();
Log.i("ParseException", e.getMessage());
}
}
});
}
这是我的适配器:
package co.eshg.limo4.adapter;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import java.util.ArrayList;
import java.util.List;
import co.eshg.limo4.R;
import co.eshg.limo4.data.ThumbnailItems;
public class GridViewAdapter extends BaseAdapter {
Context context;
LayoutInflater inflater;
private List<ThumbnailItems> thumbnailsItemsList = null;
private ArrayList<ThumbnailItems> arrayList;
public GridViewAdapter(Context context, List<ThumbnailItems> thumbnailItemsList) {
this.context = context;
this.thumbnailsItemsList = thumbnailItemsList;
inflater = LayoutInflater.from(context);
this.arrayList = new ArrayList<>();
this.arrayList.addAll(thumbnailItemsList);
}
public class ViewHolder {
ImageView imgThumb;
}
@Override
public int getCount() {
return thumbnailsItemsList.size();
}
@Override
public Object getItem(int position) {
return thumbnailsItemsList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view == null) {
holder = new ViewHolder();
view = inflater.inflate(R.layout.profile_viewpager_tab1_children, null);
holder.imgThumb = (ImageView) view.findViewById(R.id.imgThumb);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
Bitmap image = thumbnailsItemsList.get(position).getThumb();
holder.imgThumb.setImageBitmap(image);
return view;
}
}
编辑:
所以我一直在周围试图惹它,而且我已经得到它的工作。我现在的问题是,直到我点击屏幕,图像才加载。我不知道为什么会发生这种情况。
解决的办法是将thumbItemsList.add(thumbItems)
置于if条件(if (e == null)
)之内,我不知道为什么它不起作用。
答
只看不知道为什么会这样..
但我建议你使用这个库here
它采用LazyLoad
的概念在你gradle这个文件
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
您只需要设置一次(当您打开该项目时)
private void ConfigureImageLoader(){
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.resetViewBeforeLoading(true)
.cacheOnDisk(true)
.cacheInMemory(true)
.imageScaleType(ImageScaleType.EXACTLY)
.displayer(new FadeInBitmapDisplayer(300))
.build();
ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(getApplicationContext());
config.defaultDisplayImageOptions(defaultOptions);
config.memoryCache(new WeakMemoryCache());
config.threadPriority(Thread.NORM_PRIORITY - 2);
config.denyCacheImageMultipleSizesInMemory();
//config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
config.diskCacheSize(10 * 1024 * 1024); // 10 MiB
config.tasksProcessingOrder(QueueProcessingType.LIFO);
config.writeDebugLogs(); // Remove for release app
ImageLoader.getInstance().init(config.build());
}
适配器
private DisplayImageOptions options;
public GridViewAdapter(Context context, List<ThumbnailItems> thumbnailItemsList) {
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.naodisponivel)
.showImageForEmptyUri(R.drawable.naodisponivel)
.showImageOnFail(R.drawable.naodisponivel)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.displayer(new SimpleBitmapDisplayer())
.build();
}
在getView
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view == null) {
//
} else {
//
}
ImageLoader imageLoader = ImageLoader.getInstance();
final String finalImgURL = "www.mysite.com/myimage.jpg" //change url here
imageLoader.displayImage(finalImgURL, holder.imgThumb, options);
return view;
}
它下载在LazyLoad在celuar下一次的图像,高速缓存不需要重新下载过程的图像,你配置选项
我帮了忙。
+0
这不会是一个动态的解决方案。我不得不手动添加想要加载的每个图像的URL,这不是我正在寻找的。感谢您的建议。 – UltraAlkaline
但是解析服务器在1月17日前关闭,他们的srrvices会停止工作,,,所以考虑迁移你的后端 – user5894647
已经做到了。 – UltraAlkaline
那么祝你的应用程序兄弟 – user5894647