[英]Image cannot be displayed in GridView?
我用 ImageView 和 GridView 構建了一個簡單的應用程序。 我從互聯網資源加載圖像。 該應用程序可以顯示圖像(我用ImageView
測試),但它不能顯示列表中的所有圖像。
我測試了以下內容:
DownloadImage
工作正常。ImageAdapter
也可以。 但是, GridView
上仍然無法加載圖像。 無需外部庫(畢加索、Glide...) 。
這是activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
tools:context=".MainActivity">
<GridView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:id="@+id/gridview"/>
</ScrollView>
這是DownloadImage.java
package com.example.imageviewer;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;
import java.io.InputStream;
import java.net.URL;
public class DownloadImage extends AsyncTask<String, Void, Bitmap> {
ImageView imageview;
public DownloadImage(ImageView imageview){
this.imageview = imageview;
}
@Override
protected Bitmap doInBackground(String... strings) {
String url = strings[0];
Bitmap result = null;
try{
InputStream in = new URL(url).openConnection().getInputStream();
result = BitmapFactory.decodeStream(in);
}catch(Exception e){
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
imageview.setImageBitmap(bitmap);
}
}
這是ImageAdapter.java
package com.example.imageviewer;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
public class ImageAdapter extends BaseAdapter {
private Context context;
private String[] imagelist;
public ImageAdapter(Context context, String[] imagelist) {
this.context = context;
this.imagelist = imagelist;
}
@Override
public int getCount() {
return imagelist.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imagview;
if(convertView==null)
imagview = new ImageView(context);
else
imagview = (ImageView)convertView;
new DownloadImage(imagview).execute(imagelist[position]);
return imagview;
}
}
這是MainActivity.java
package com.example.imageviewer;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
public class MainActivity extends AppCompatActivity {
GridView gridview;
String[] urls = {
"https://sarahraven.images.blucommerce.com/sarahraven/product/261037_2.jpg",
"https://ngb.org/wp-content/uploads/2018/09/longfield.gardens.Sept_.jpg"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridview = findViewById(R.id.gridview);
ImageAdapter imageadapter = new ImageAdapter(getApplicationContext(), urls);
gridview.setAdapter(imageadapter);
gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
});
}
}
這是日志貓:
10-11 08:41:27.040 10544-10544/? I/art: Not late-enabling -Xcheck:jni (already on)
10-11 08:41:27.458 10544-10544/com.example.imageviewer W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter androidx.vectordrawable.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
10-11 08:41:27.646 10544-10544/com.example.imageviewer I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$OnUnhandledKeyEventListenerWrapper>
10-11 08:41:27.669 10544-10544/com.example.imageviewer I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$OnUnhandledKeyEventListenerWrapper>
10-11 08:41:27.767 10544-10557/com.example.imageviewer I/art: Background sticky concurrent mark sweep GC freed 2403(236KB) AllocSpace objects, 0(0B) LOS objects, 22% free, 874KB/1135KB, paused 2.275ms total 159.898ms
10-11 08:41:28.360 10544-10563/com.example.imageviewer D/OpenGLRenderer: Render dirty regions requested: true
10-11 08:41:28.419 10544-10544/com.example.imageviewer D/Atlas: Validating map...
10-11 08:41:28.764 10544-10563/com.example.imageviewer I/OpenGLRenderer: Initialized EGL, version 1.4
10-11 08:41:28.833 10544-10563/com.example.imageviewer D/EGL_emulation: eglCreateContext: 0x7f8131b44740: maj 3 min 0 rcv 3
10-11 08:41:28.865 10544-10563/com.example.imageviewer D/EGL_emulation: eglMakeCurrent: 0x7f8131b44740: ver 3 0 (tinfo 0x7f8131b11260)
10-11 08:41:28.880 10544-10563/com.example.imageviewer E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf
10-11 08:41:28.880 10544-10563/com.example.imageviewer E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008824
10-11 08:41:28.884 10544-10563/com.example.imageviewer D/OpenGLRenderer: Enabling debug mode 0
10-11 08:41:28.985 10544-10563/com.example.imageviewer D/EGL_emulation: eglMakeCurrent: 0x7f8131b44740: ver 3 0 (tinfo 0x7f8131b11260)
10-11 08:41:29.019 10544-10544/com.example.imageviewer I/Choreographer: Skipped 33 frames! The application may be doing too much work on its main thread.
提前致謝!
我不建議您編寫自己的圖像下載器,因為已經有一些庫(如Glide和Picasso )可用於此目的。
在您的情況下,問題可能是ImageView
需要一些時間才能先下載圖像。 因此,我認為您確實應該使用Glide
或Picasso
將圖像加載到ImageView
內的GridView
中。
我在大多數情況下都使用 Glide,它的使用和集成非常簡單。 您不必自己編寫DownloadImage
class。 只需以下代碼片段即可。
Glide
.with(context)
.load(url)
.into(imagview);
要集成 Glide,只需在build.gradle
文件中添加以下依賴項,就可以了!
repositories {
mavenCentral()
google()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.10.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'
}
我希望這會有所幫助!
如果你不習慣使用外部庫,你需要實現 Glide 自己實現的行為!
您需要在必要時延遲加載圖像。 在GridView
中,圖像在可見時按需加載。 我建議查看滾動選項,以便您可以區分何時有彈跳或輕微滾動。 這有點棘手。 我建議調查這個答案。
該錯誤是由於將GridView
放入ScrollView
引起的。 基本上, GridView
內部包含一個可滾動的小部件。 只需刪除ScrollView
正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.