- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有这个用于 android 的 listView 的 ImageAdapter:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
RelativeLayout relativeLayout = null;
Offer currentOffer = mOffersList.get(position);
if (convertView == null) { // create a new view if no recycling
// available
// Make up a new view
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.offer_list_item, null);
relativeLayout = (RelativeLayout) view
.findViewById(R.id.offerImage);
} else {
view = (View) convertView;
relativeLayout = (RelativeLayout) view
.findViewById(R.id.offerImage);
setBackgroundDrawable(relativeLayout, null);
}
String imageUrl = "";
imageUrl = currentOffer.getImageUrl().toString();
Bitmap bitmap = imageCache.get(imageUrl);
if (bitmap != null) {
Drawable dr = new BitmapDrawable(mContext.getResources(), bitmap);
setBackgroundDrawable(relativeLayout, dr);
} else {
if (!downloadingImageUrls.contains(imageUrl)) {
downloadingImageUrls.add(imageUrl);
new DownloadImageAsyncTask().execute(imageUrl);
}
}
return view;
}
还有这个:
class DownloadImageAsyncTask extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
String imageUrl = params[0];
try {
Bitmap bitmap = BitmapFactory
.decodeStream((InputStream) new URL(imageUrl)
.getContent());
imageCache.put(imageUrl, bitmap);
} catch (IOException e) {
Log.e("DownloadImageAsyncTask", "Error reading bitmap" + e);
}
downloadingImageUrls.remove(imageUrl);
return null;
}
@Override
protected void onPostExecute(Void result) {
notifyDataSetChanged();
}
}
为什么所有的列表项一起加载?它不是异步的,但不是一个一个的。全部一起。
我怎样才能延迟加载它?
为什么这段代码更高效?
// better
public class DownloadImageAsyncTask2 extends
AsyncTask<String, Void, Bitmap> {
private final ImageView imageView;
public DownloadImageAsyncTask2(ImageView imageView) {
this.imageView = imageView;
}
@Override
protected void onPreExecute() {
Log.i("DownloadImageAsyncTask", "Starting image download task...");
}
@Override
protected Bitmap doInBackground(String... params) {
try {
return BitmapFactory.decodeStream((InputStream) new URL(
params[0]).getContent());
} catch (IOException e) {
Log.e("DownloadImageAsyncTask", "Error reading bitmap" + e);
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
}
}
}
最佳答案
为了回答您最初的问题,您编写的任何适配器都与它所调用的完全一样;它是一个适配器。它允许您将数据转换为在 AdapterView 中显示的 View 。强制所有 View “延迟加载”是没有意义的,坦率地说,出于某些原因不应该这样做。
您可能会争辩说,如果 Adapter 子类具有 loadLazily(Uri image, ImageView view)
函数会很好。如果是这样,为什么不自己继承 AbsAdapter 并添加它或向 AOSP 提交补丁。但是,我怀疑您会同意即使是这样的函数也应该作为适配器的一部分包含在内。以高效的方式管理数据确实是您的工作,尽管在 Android 中依靠系统进行数据管理是多么正常。
要回答有关您提出的两种延迟加载方法的其他问题,区别在于第一种方法会导致 AdapterView 重新加载其所有 View ,而在第二种方法中,您只是使正在加载的 View 无效图片。
我实际上并不同意第二种方法在整体上“更好”,因为每次您的配置更改或进程终止并且需要重新加载 View 时,您都需要通过网络或文件系统进行新调用以载入你的图像。如果像在第一种方法中那样缓存它们,那么至少可以避免需要通过配置更改重新加载所有图像。如果您编写了一个在其自己的进程中运行的单独图像加载服务(我不推荐这样做),您还可以避免第二种情况(您的 :default 进程被杀死)。
要点是,您负责加载图像,而不是 Android。如果你想为你完成它,看看这些很棒的图像加载或其他通用的 android 资源获取库:Local image caching solution for Android: Square Picasso vs Universal Image Loader .我个人用过Universal-Image-Loader之前并承认它按广告宣传的那样工作。但是,它将您的所有图像缓存在外部存储上,这可能不适合您。
关于java - 为什么 android ImageAdapter 不延迟加载图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21812448/
我希望带有 ImageAdapter 的 GridView 具有自定义按下的按钮。我已经有了自定义按钮,但是 onClick 它会在按钮周围创建一个很大的橙色 onClick 东西。我只希望 onCl
我目前正在开发一个应用程序,它允许用户从 GridView 库中选择一个 ImageView 并单独显示它并展示它的所有美感。 GridView 在 fragment 上,然后将数据传递给 Activ
下面是我的代码。我正在尝试将我的 SD 卡中的图像检索到 GridView 中。我的代码有问题。我不知道如何将图像设置到我的 ImageView 中。我的 ImageAdapter 中出现错误“Ima
我有一个 getView() 的 Android Gallery ImageAdapter 实现,如下所示: public View getView(int arg0, View arg1, View
每次我测试我的应用程序时,它都会在闪屏后崩溃,并给出如下错误: 02-14 13:03:29.305: A/libc(9935): Fatal signal 11 (SIGSEGV) at 0x000
我正在尝试按照 ImageView 和 GalleryView 教程在 fragment 类中添加一个 galleryview,但是出现无法将 ImageAdapter 应用于 Tab1Fragmen
ListView 代码如下: public final static String ITEM_TITLE = "title"; public final static String ITE
我用来将图像从 SD 卡显示到 GridView 的 ImageAdapter 代码导致图像重复。同一组图像(例如 10 个)在 GridView 中重复。 这是我的适配器代码: private cl
我正在使用带有 ImageAdapter 的 Gallery 加载它,并使用 ImageViews 从我的资源中提取图像。我的问题是在我的适配器中传递给 getView() 方法的 convertVi
我做了什么 我在布局中创建了一个 GridView。这个 GridView 我想填充我在 Google 文档中创建的 ImageAdapter:Hello GridView 我的图片的图片路径,我保存
我的安卓有问题。我想使用以下代码为图库设置 ImageAdapter: Integer[] images = {R.drawable.image01}; static int counter = 0;
我有这个用于 android 的 listView 的 ImageAdapter: @Override public View getView(int position, View convertVi
我正在尝试使用 ImageAdapter 在 GridView 中显示我的 Activity 图像。都是基本功能,即使我匹配来自多个来源的代码,但我的代码没有运行,这是什么问题?ImageAdapte
好吧,在周末取得了很多进展之后,我陷入了 gridView 和 ImageAdapter 的困境。到目前为止,我所做的就是我的主要 Activity 获取用户选择的标签,执行查询并返回 json_ec
正如标题已经提到的,我想更改我的 ImageView onClick 吗?我在 ImageAdapter 中制作了一个包含 4 个项目的 GridView。当我单击每个 ImageView 时,它会在
我是 Android 新手,在“扩展 Fragment”上实现 GridView 时遇到一个问题。 Tab2SalonActivity.java public class Tab2SalonActiv
我正在实现一个支持多项选择的图片库。主要布局是 GridView,它使用自定义 Adapter。每个显示的项目都是 ImageView + CheckBox 的组合。如果选中了多个复选框,我想通过触摸
我正在使用 ImageAdapter extends BaseAdapter 来扩展 gridview。 Gridview 有两个 textview。我想为其中之一设置自定义字体。在 ImageAda
我正在尝试创建一个 Logo 测验,这很有效,但我无法弄清楚如何从 ImageAdapter 修改特定图像。任何指导将不胜感激。谢谢! 这是我的测验 Activity : public class Q
我正在使用 google 文档中提供的示例 ImageAdpater 来使用可绘制对象填充 gridview。我想要做的是用 xml 文件中的一组可绘制对象填充 gridview。 我使用 Typed
我是一名优秀的程序员,十分优秀!