缩略图在 RecyclerView 中保持空白 (Android)。我是否正确使用 Glide?
Thumbnail stays blank in RecyclerView (Android). Am I using Glide correctly?
我正在开发一个 Android 应用程序,它显示与搜索词匹配的图书列表。我正在使用 Google 书籍 API。从 API 我得到以下项目的列表:标题、作者、发布日期和要显示的小缩略图的 URI。
我可以在 RecyclerView 中显示除缩略图之外的信息。为此,我正在尝试使用 Glide 库。它总是保持空白,如果我使用占位符选项,它总是显示占位符。 (我也在 Gradle 文件中添加了依赖项)。
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
我试过调试,确实变量 mThumbnail
不为空并且有一个有效地址。这是将 Glide 用于缩略图的正确方法吗?
我将 post 在 RecyclerView 项目和适配器代码的布局下方。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:paddingEnd="16dp"
android:paddingLeft="16dp"
android:paddingStart="16dp"
android:paddingRight="16dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/book_thumbnail"
android:layout_width="100dp"
android:layout_height="150dp"
<!--app:layout_constraintDimensionRatio = "4:5.5"-->
/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:visibility="visible">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Le petit prince" />
<TextView
android:id="@+id/authors"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Antoine-Saint Exupery" />
<TextView
android:id="@+id/publishedDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="1943" />
</LinearLayout>
</LinearLayout>
适配器代码:
package com.example.booksearch;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* Adapter used for RecyclerView
*/
public class BookListAdapter extends RecyclerView.Adapter<BookListAdapter.BookViewHolder>{
private LayoutInflater mInflater;
private final List<Book> mBookList;
Context context;
/**
* BookListAdapter constructor.
* @param context Takes context of applications
* @param bookList A list of books.
*/
public BookListAdapter(Context context, ArrayList<Book> bookList){
mInflater = LayoutInflater.from(context);
this.mBookList = bookList;
this.context = context;
}
/**
* Empties adapter.
*/
public void clear(){
mBookList.clear();
}
/**
* Adds all books to adapter.
* @param books List of books to add.
*/
public void addAll(ArrayList<Book> books){
mBookList.addAll(books);
}
/**
* Used on creating of BookViewHolder
* @param parent BookViewHolder
* @param viewType
* @return A BookViewHolder object
*/
@NonNull
@Override
public BookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View mItemView = mInflater.inflate(R.layout.book_item,parent, false);
return new BookViewHolder(mItemView, this);
}
/**
* Binds (sets content of ViewHolder)
* @param holder Holder to work on
* @param position Position of the book that belongs to the ViewHolder
*/
@Override
public void onBindViewHolder(@NonNull BookListAdapter.BookViewHolder holder, int position) {
String mTitle = mBookList.get(position).getTitle();
String mAuthor = mBookList.get(position).getAuthor();
String mPublishedDate = mBookList.get(position).getPublishedYear();
Uri mThumbnailUri = mBookList.get(position).getThumbnailUri();
holder.titleView.setText(mTitle);
holder.authorView.setText(mAuthor);
holder.publishedYearView.setText(mPublishedDate);
if (!mThumbnailUri.toString().isEmpty()){
Glide.with(context)
.load(mThumbnailUri.toString())
.override(100,200)
//.placeholder(R.drawable.ic_baseline_book_24)
.into(holder.thumbnailView);
} else {
Glide.with(context)
.load(R.drawable.ic_baseline_book_24)
.into(holder.thumbnailView);
holder.thumbnailView.setImageAlpha(50);
}
}
/**
* Returns size of book list.
* @return An integer with size of the list.
*/
@Override
public int getItemCount() {
return mBookList.size();
}
/**
* Inner class of BookListAdapter, for ViewHolder of book object.
*/
class BookViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public final TextView titleView;
public final TextView authorView;
public final TextView publishedYearView;
public final ImageView thumbnailView;
final BookListAdapter mAdapter;
/**
* Constructor of BookViewHolder object.
* @param itemView The itemView for one book object.
* @param adapter The adapter that is used for book objects.
*/
public BookViewHolder(View itemView, BookListAdapter adapter){
super(itemView);
titleView = itemView.findViewById(R.id.title);
authorView = itemView.findViewById(R.id.authors);
publishedYearView = itemView.findViewById(R.id.publishedDate);
thumbnailView = itemView.findViewById(R.id.book_thumbnail);
//thumbnailView.setScaleType(ImageView.ScaleType.CENTER);
this.mAdapter = adapter;
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
}
}
}
我还没有足够的声誉来发表评论,所以我可以询问你的 api 结果吗?和缩略图日志?
我现在假设你的 json 或任何你的 api 结果,缩略图的 return 是字符串,如果它是字符串那么你只需要加载它滑行,但当然首先将您的模型重构为 String
所以你的代码
Uri mThumbnailUri = mBookList.get(position).getThumbnailUri()
成为
String mThumbnail = mBookList.get(position).getThumbnail()
Glide.with(context).load(mThumbnail)
因为 glide 可以将字符串作为参数
由于在 Android(9.0 及更高版本)中默认禁用明文支持,因此无法正确加载图像。查看日志并找到以下内容后:
2021-01-22 20:45:02.702 25417-25417/com.example.booksearch W/Glide: Load failed for http://books.google.com/books/content?id=EJuKSkd5K94C&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api with size [60x150]
class com.bumptech.glide.load.engine.GlideException: Failed to load resource
There was 1 cause:
java.io.IOException(Cleartext HTTP traffic to books.google.com not permitted)
call GlideException#logRootCauses(String) for more detail
Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class java.io.InputStream, REMOTE
There was 1 cause:
java.io.IOException(Cleartext HTTP traffic to books.google.com not permitted)
call GlideException#logRootCauses(String) for more detail
我将以下内容添加到 Android Manifest.xml 文件(在应用程序部分):
<applicaton
...
android:usesCleartextTraffic="true"
...>
</application>
我正在开发一个 Android 应用程序,它显示与搜索词匹配的图书列表。我正在使用 Google 书籍 API。从 API 我得到以下项目的列表:标题、作者、发布日期和要显示的小缩略图的 URI。
我可以在 RecyclerView 中显示除缩略图之外的信息。为此,我正在尝试使用 Glide 库。它总是保持空白,如果我使用占位符选项,它总是显示占位符。 (我也在 Gradle 文件中添加了依赖项)。
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
我试过调试,确实变量 mThumbnail
不为空并且有一个有效地址。这是将 Glide 用于缩略图的正确方法吗?
我将 post 在 RecyclerView 项目和适配器代码的布局下方。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:paddingEnd="16dp"
android:paddingLeft="16dp"
android:paddingStart="16dp"
android:paddingRight="16dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/book_thumbnail"
android:layout_width="100dp"
android:layout_height="150dp"
<!--app:layout_constraintDimensionRatio = "4:5.5"-->
/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:visibility="visible">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Le petit prince" />
<TextView
android:id="@+id/authors"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Antoine-Saint Exupery" />
<TextView
android:id="@+id/publishedDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="1943" />
</LinearLayout>
</LinearLayout>
适配器代码:
package com.example.booksearch;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* Adapter used for RecyclerView
*/
public class BookListAdapter extends RecyclerView.Adapter<BookListAdapter.BookViewHolder>{
private LayoutInflater mInflater;
private final List<Book> mBookList;
Context context;
/**
* BookListAdapter constructor.
* @param context Takes context of applications
* @param bookList A list of books.
*/
public BookListAdapter(Context context, ArrayList<Book> bookList){
mInflater = LayoutInflater.from(context);
this.mBookList = bookList;
this.context = context;
}
/**
* Empties adapter.
*/
public void clear(){
mBookList.clear();
}
/**
* Adds all books to adapter.
* @param books List of books to add.
*/
public void addAll(ArrayList<Book> books){
mBookList.addAll(books);
}
/**
* Used on creating of BookViewHolder
* @param parent BookViewHolder
* @param viewType
* @return A BookViewHolder object
*/
@NonNull
@Override
public BookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View mItemView = mInflater.inflate(R.layout.book_item,parent, false);
return new BookViewHolder(mItemView, this);
}
/**
* Binds (sets content of ViewHolder)
* @param holder Holder to work on
* @param position Position of the book that belongs to the ViewHolder
*/
@Override
public void onBindViewHolder(@NonNull BookListAdapter.BookViewHolder holder, int position) {
String mTitle = mBookList.get(position).getTitle();
String mAuthor = mBookList.get(position).getAuthor();
String mPublishedDate = mBookList.get(position).getPublishedYear();
Uri mThumbnailUri = mBookList.get(position).getThumbnailUri();
holder.titleView.setText(mTitle);
holder.authorView.setText(mAuthor);
holder.publishedYearView.setText(mPublishedDate);
if (!mThumbnailUri.toString().isEmpty()){
Glide.with(context)
.load(mThumbnailUri.toString())
.override(100,200)
//.placeholder(R.drawable.ic_baseline_book_24)
.into(holder.thumbnailView);
} else {
Glide.with(context)
.load(R.drawable.ic_baseline_book_24)
.into(holder.thumbnailView);
holder.thumbnailView.setImageAlpha(50);
}
}
/**
* Returns size of book list.
* @return An integer with size of the list.
*/
@Override
public int getItemCount() {
return mBookList.size();
}
/**
* Inner class of BookListAdapter, for ViewHolder of book object.
*/
class BookViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public final TextView titleView;
public final TextView authorView;
public final TextView publishedYearView;
public final ImageView thumbnailView;
final BookListAdapter mAdapter;
/**
* Constructor of BookViewHolder object.
* @param itemView The itemView for one book object.
* @param adapter The adapter that is used for book objects.
*/
public BookViewHolder(View itemView, BookListAdapter adapter){
super(itemView);
titleView = itemView.findViewById(R.id.title);
authorView = itemView.findViewById(R.id.authors);
publishedYearView = itemView.findViewById(R.id.publishedDate);
thumbnailView = itemView.findViewById(R.id.book_thumbnail);
//thumbnailView.setScaleType(ImageView.ScaleType.CENTER);
this.mAdapter = adapter;
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
}
}
}
我还没有足够的声誉来发表评论,所以我可以询问你的 api 结果吗?和缩略图日志?
我现在假设你的 json 或任何你的 api 结果,缩略图的 return 是字符串,如果它是字符串那么你只需要加载它滑行,但当然首先将您的模型重构为 String 所以你的代码
Uri mThumbnailUri = mBookList.get(position).getThumbnailUri()
成为
String mThumbnail = mBookList.get(position).getThumbnail()
Glide.with(context).load(mThumbnail)
因为 glide 可以将字符串作为参数
由于在 Android(9.0 及更高版本)中默认禁用明文支持,因此无法正确加载图像。查看日志并找到以下内容后:
2021-01-22 20:45:02.702 25417-25417/com.example.booksearch W/Glide: Load failed for http://books.google.com/books/content?id=EJuKSkd5K94C&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api with size [60x150]
class com.bumptech.glide.load.engine.GlideException: Failed to load resource
There was 1 cause:
java.io.IOException(Cleartext HTTP traffic to books.google.com not permitted)
call GlideException#logRootCauses(String) for more detail
Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Fetching data failed, class java.io.InputStream, REMOTE
There was 1 cause:
java.io.IOException(Cleartext HTTP traffic to books.google.com not permitted)
call GlideException#logRootCauses(String) for more detail
我将以下内容添加到 Android Manifest.xml 文件(在应用程序部分):
<applicaton
...
android:usesCleartextTraffic="true"
...>
</application>