- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道标题有点乱,但这就是问题所在....我的目标是检索标题,并使用缩略图 URL 将我的 YouTube channel 视频的缩略图绘制到 ListView 中...到目前为止,我有 textView 可以正确显示视频标题,但无论如何都无法绘制缩略图.....顺便说一下,我已经正确完成了 json/sqlite 东西类,它们可以正确检索数据,所以我不不得不担心...唯一困扰我的是缩略图不会显示,imageView 在应用程序中显示为空白区域...
这是我的代码,请帮帮我。谢谢
这是 Activity 的创建方法...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] uiBindFrom = { TutListDatabase.COL_TITLE, TutListDatabase.COL_THUMBNAIL };
int[] uiBindTo = { R.id.title, R.id.thumbnail };
getLoaderManager().initLoader(TUTORIAL_LIST_LOADER, null, this);
adapter = new SimpleCursorAdapter(
getActivity().getApplicationContext(), R.layout.list_item,
null, uiBindFrom, uiBindTo,
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
adapter.setViewBinder(new MyViewBinder());
setListAdapter(adapter);
}
这个是将东西放到 listView 上的私有(private)类...
private class MyViewBinder implements SimpleCursorAdapter.ViewBinder{
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
int viewId = view.getId();
switch(viewId){
case R.id.title:
TextView titleTV = (TextView)view;
titleTV.setText(cursor.getString(columnIndex));
break;
// it is not displaying any thumbnail in app....
case R.id.thumbnail:
ImageView thumb = (ImageView) view;
thumb.setImageURI(Uri.parse(cursor.getString(columnIndex)));
break;
}
return false;
}
}
这是 xml 布局文件...
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal" >
<ImageView
android:id="@+id/thumbnail"
android:layout_width="101dp"
android:layout_height="101dp"
android:src="@drawable/icon" />
<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="6dp"
android:textSize="24dp" />
</LinearLayout>
最佳答案
我可以向您展示我使用过的一种方法,它工作得很好,首先我们需要一种方法来缓存图像,迄今为止我看到的最好的方法是使用优秀的 Google 中描述的 LruCache IO 演示文稿事半功倍:http://www.youtube.com/watch?v=gbQb1PVjfqM
这是我对该演示文稿中描述的方法的实现。
public class BitmapCache extends LruCache<String, Bitmap> {
public BitmapCache(int sizeInBytes) {
super(sizeInBytes);
}
public BitmapCache(Context context) {
super(getOptimalCacheSizeInBytes(context));
}
public static int getOptimalCacheSizeInBytes(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
int memoryClassBytes = am.getMemoryClass() * 1024 * 1024;
return memoryClassBytes / 8;
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
}
接下来我们需要使用 AsyncTask 异步加载图像,以下实现负责将图像加载到给定的 ImageView 并处理缓存:
public class LoadImageAsyncTask extends AsyncTask<Void, Void, Pair<Bitmap, Exception>> {
private ImageView mImageView;
private String mUrl;
private BitmapCache mCache;
public LoadImageAsyncTask(BitmapCache cache, ImageView imageView, String url) {
mCache = cache;
mImageView = imageView;
mUrl = url;
mImageView.setTag(mUrl);
}
@Override
protected void onPreExecute() {
Bitmap bm = mCache.get(mUrl);
if(bm != null) {
cancel(false);
mImageView.setImageBitmap(bm);
}
}
@Override
protected Pair<Bitmap, Exception> doInBackground(Void... arg0) {
if(isCancelled()) {
return null;
}
URL url;
InputStream inStream = null;
try {
url = new URL(mUrl);
URLConnection conn = url.openConnection();
inStream = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inStream);
return new Pair<Bitmap, Exception>(bitmap, null);
} catch (Exception e) {
return new Pair<Bitmap, Exception>(null, e);
}
finally {
closeSilenty(inStream);
}
}
@Override
protected void onPostExecute(Pair<Bitmap, Exception> result) {
if(result == null) {
return;
}
if(result.first != null && mUrl.equals(mImageView.getTag())) {
mCache.put(mUrl, result.first);
mImageView.setImageBitmap(result.first);
}
}
public void closeSilenty(Closeable closeable) {
if(closeable != null) {
try {
closeable.close();
} catch (Exception e) {
// TODO: Log this
}
}
}
}
接下来,您需要在托管 ListView 的 Activity 或 Fragment 中的 onCreate(...) 或 onActivityCreated(...) 中创建 BitmapCache 实例:
mBitmapCache = new BitmapCache(this); // or getActivity() if your using a Fragment
现在我们需要更新显示图像的 SimpleCursorAdapter,我省略了大部分代码,因为它特定于我的项目,但我的想法是重写 setViewImage,其中值应该是绑定(bind)到光标的值,我将 imageview 设为 null 以确保它没有来自与项目关联的缓存的奇怪图像。
@Override
public void setViewImage(ImageView iv, String value) {
final String url = value;
iv.setImageBitmap(null);
new LoadImageAsyncTask(mBitmapCache, iv, url).execute();
}
更新
为了清楚起见,你的适配器应该看起来像这样
adapter = new SimpleCursorAdapter(
context, R.layout.list_item,
null, uiBindFrom, uiBindTo,
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER) {
@Override
public void setViewImage(ImageView iv, String value) {
final String url = value;
iv.setImageBitmap(null);
new LoadImageAsyncTask(mBitmapCache, iv, url).execute();
}
};
希望对您有所帮助!
关于Android,通过使用 SimpleCursorAdapter.ViewBinder 将 URL 解析为参数来检索缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12513432/
我使用包含布局,我需要更改它的可见性: 而 layout_select_provinces 是这样的: 但是当我将 Id 设置为
我尝试在Build.gradle.kts中添加*View Binding。*我无法将BuildFeature{viewBinding;true}添加到Build.gradle.kts中。kts显示一条
我现在在 kotlin 中使用 viewBinding。 这是我的build.gradle 启用 ViewBinding 并自动导入 ViewBinding 依赖。 但 Android Studio
碰巧我有一个主应用程序模块 构建.gradle dynamicFeatures = [":myFeature"] viewBinding { enabled = tru
我的风格包含与我的 main 中相同的布局资源。源集。这样它就可以用特定于 flavor 的那一种来覆盖主要的那一种。我在很多地方都这样做过,在我介绍 ViewBinding 之前效果很好。 .为了准
编辑 - 解决方案 使用 View 绑定(bind)时,会为每个 xml 生成一个 Java 绑定(bind)文件。问题是当您修改 xml 时,它不会重新生成 Java 文件。因此,当我向 activ
我需要显示一个带有一些图像的 ListView,我正在使用以下代码: dataText = (TextView)findViewById(R.id.data); dataText.se
我有一个 ViewBinder,它充当我的 ListView 和数据库游标适配器之间的中间人。根据显示此数据的上下文,我需要 ViewBinder 来执行不同的操作。 例如,以一个任务管理应用程序为例
我有一个布局复杂的列表 R.layout.menu_row。它由一个 ProgressBar 和一个文本字段组成。我使用的适配器: SimpleAdapter simpleAdapter = n
我对这个"new"Android View 绑定(bind)有疑问。当我尝试使用 时出现异常在我的 XML 布局文件中: 包含文件只是一个基本的布局文件。如果我替换 一切正常直接使用应包含的布局
如何/在哪里可以找到生成的 ViewBinding 代码? 每当我尝试 control+click/control+b 来查看声明时,AndroidStudio 只会打开 XML 布局。 最佳答案 生
将 Android Studio 更新为 后北极狐和 Android Gradle 插件到 7.0.0 我正面临这个警告,我的意思是尽管有这个警告,应用程序仍然可以成功构建,但是我在这里缺少什么?这里
我开始使用 ViewBinding。在搜索了一些示例或建议如何将 ViewBinding 与抽象基类一起使用后,该抽象基类应处理预期出现在每个子布局中的 View 的相同逻辑,我最终在此处发布了此问题
我想用自定义 View 试用 ViewBinding,例如: MainActivity layout_main.xml MyCustomView layout_my_custom_view.xml
在使用 ViewBinding 时,我遇到了一些未记录的案例。 第一:如何获得包含的通用 View 布局部分的绑定(bind),主绑定(bind)只看到主布局中的项目? 第二:如何获得包含的合并类型布
我在 build.gradle 文件中启用了 View 绑定(bind): android { ... viewBinding { enabled = true
我有一个从本地数据库中获取的项目列表。每个项目都有属性 isNew。我只想为匹配 isNew = true 的项目显示带有文本“new”的 TextView。我用两种方法解决了这个问题,现在我想知道哪
我正在使用 SimpleCursorAdapter,我不确定为什么它有时会起作用。如果我重做相同的查询,我会得到不同的绑定(bind)。虽然我知道这与光标的内容无关。 我要做的就是在 cursor.g
我已经在 android 中使用 SQlite 成功创建了一个表。数据库中有一列性别(男/女)。我想做的是检查性别类型并根据类型显示男/女图标。我使用了 setViewBinder() 来传递列索引(
我们正在使用 DataBinding自 Jetpack 发布以来。 Android 文档表明 ViewBinding在 Android Studio 3.6 Canary 11+ 中添加。 我阅读了文
我是一名优秀的程序员,十分优秀!