Изображение не может быть отображено в GridView? - PullRequest
0 голосов
/ 11 октября 2019

Я создаю простое приложение с ImageView и GridView. Я загружаю изображения с интернет-ресурса. Приложение может отображать изображение (я тестировал с ImageView), но не может отображать все изображения в списке.

Я тестировал следующее:

  1. Класс DownloadImage работалобычно.
  2. С ImageAdapter тоже все в порядке.

Однако изображения по-прежнему не могут быть загружены на GridView. Нет необходимости во внешних библиотеках (Picasso, 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.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Ошибка вызвана помещением GridView внутрь ScrollView. По сути, GridView содержит прокручиваемый виджет внутри. Просто удалите ScrollView и все работает нормально.

0 голосов
/ 11 октября 2019

Я не рекомендую писать свой собственный загрузчик изображений, поскольку есть некоторые библиотеки, такие как Glide и Picasso , которые уже доступны для этой цели.

В вашем случае проблема может заключаться в том, что ImageView сначала требуется некоторое время для загрузки изображений. Следовательно, я думаю, что вы действительно должны использовать Glide или Picasso для загрузки ваших изображений в ваши ImageView s внутри GridView.

Я использую Glide в большинстве случаев, и он довольно прост в использовании и интеграции. Вам не нужно писать свой DownloadImage класс самостоятельно. Просто следующий фрагмент кода будет делать.

 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 изображения загружаются по запросу, когда они видны. Я рекомендую изучить параметры прокрутки, чтобы вы могли различать, когда происходит бросок или небольшая прокрутка. Это немного сложно. Я рекомендую посмотреть этот ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...