Пустое приложение без каких-либо ошибок

это мое приложение для загрузки изображений, которое отображает изображения, загруженные с URL-адреса изображения, и отображает их в listView. приложение работает нормально и не показывает никаких ошибок, но дисплей пустой, и я ничего не вижу ..

ImageDownloader:

public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {

    private Bitmap bitmap;

    public Bitmap getBitmap() {
        return bitmap;
    }

    @Override
    protected Bitmap doInBackground(String... params) {

        try {
            URL url = new URL(params[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            if (connection.getContentType().contains("image")) {
                InputStream inputStream = connection.getInputStream();
                bitmap = BitmapFactory.decodeStream(inputStream);
                return bitmap;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

RowItem:

public class RowItem {

    private Bitmap bitmap;

    public RowItem(Bitmap bitmap) {
        this.bitmap = bitmap;
    }

    public Bitmap getBitmap() {
        return bitmap;
    }
}

CustomListViewAdapter:

public class CustomListViewAdapter extends ArrayAdapter<RowItem> {

    Context context;

    public CustomListViewAdapter(Context context, int resourceId, List<RowItem> items) {
        super(context, resourceId, items);
        this.context = context;
    }

    private class ViewHolder {
        ImageView imageView;
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder = null;

        RowItem rowItem = getItem(position);

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {

            convertView = inflater.inflate(R.layout.list_item, null);

            holder = new ViewHolder();

            holder.imageView = (ImageView) convertView.findViewById(R.id.imageView);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.imageView.setImageBitmap(rowItem.getBitmap());

        return convertView;
    }

}

Основное занятие:

public class MainActivity extends AppCompatActivity {

    ArrayList<String> urls = new ArrayList<>();

    ArrayList<Bitmap> bitmaps = new ArrayList<>();

    ListView listView;

    List<RowItem> rowItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("Flag 1");
        addUrls();
        System.out.println("Flag 2");
        for (int i = 0; i < urls.size(); i++) {

            ImageDownloader imageDownloader = new ImageDownloader();

            imageDownloader.execute(urls.get(i));

            bitmaps.add(imageDownloader.getBitmap());

            System.out.println("Size"+bitmaps.size());
        }

        System.out.println("Flag 3");
        rowItems = new ArrayList<>();

        for (int i = 0; i < bitmaps.size(); i++) {
            RowItem item = new RowItem(bitmaps.get(i));
            rowItems.add(item);
        }
        System.out.println("Flag 4");
        listView = (ListView) findViewById(R.id.list);
        CustomListViewAdapter adapter = new CustomListViewAdapter(this, R.layout.list_item, rowItems);
        listView.setAdapter(adapter);
        System.out.println("Flag 5");
    }

    public void addUrls() {

        urls.add("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTXEZRoYOhIJxL5foNz_NlatDlgYStzZgVIiKuo6vtRtz2wY-8b4Q");
        urls.add("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSFL3WYbqNOX-dwjtT1LroBlY5W-3YuwSIuCMRaLpnjMXbVPEJy");
        urls.add("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQiwgrJeAJN-7lcy92N51uP7XzccK_p-fTSJNCXPLPSVih8wqPf");
        urls.add("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT19dYLCEZlMRqojedJB-05jTrflD74nasvkXs-SdVeyM2BEpCSFA");
        urls.add("http://wallpaperswide.com/download/high_tech_earth-wallpaper-2880x1800.jpg");
        urls.add("https://www.gettyimages.ca/gi-resources/images/Homepage/Hero/UK/CMS_Creative_164657191_Kingfisher.jpg");
        urls.add("https://images.unsplash.com/photo-1418489098061-ce87b5dc3aee?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=2f033882f3c25404e3f904fbfe2351be&w=1000&q=80");
        urls.add("https://techcrunch.com/wp-content/uploads/2018/03/gettyimages-705351545.jpg?w=730&crop=1");

    }
}

ativity_main.xml:

<?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 = "fill_parent"
    android:layout_height = "fill_parent"
    android:orientation = "vertical"
    tools:context = "com.example.danishrizvi.test4.MainActivity">

    <ListView
        android:id = "@+id/list"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content" />
</LinearLayout>

list_item.xml:

<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:id = "@+id/linearLayout"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:orientation = "vertical">

    <ImageView
        android:id = "@+id/imageView"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:paddingLeft = "10dp"
        android:paddingRight = "10dp"
        android:visibility = "visible"/>

</RelativeLayout>

Итак, если вы хотите показать изображение с URL-адреса в адаптере, используйте для него Glide. Он удалит ненужный код (преобразование в растровое изображение и его передача) и будет работать плавно.

zephyr 08.08.2018 15:14

Вы должны отправить растровое изображение в основное действие через onPostExecute Async Task, я думаю, когда вы вызываете bitmaps.add(imageDownloader.getBitmap());, он вернет пустое, отлаживающее и проверяющее

Tejashwi Kalp Taru 08.08.2018 15:15

Лучше использовать это для загрузки изображения в список: github.com/bumptech/glide

Faysal Ahmed 08.08.2018 15:20
0
3
47
2

Ответы 2

Я предлагаю вам использовать библиотеку для загрузки изображения с URL-адреса, например Пикассо или Скольжение (с кэшированием памяти и диска, чтобы избежать загрузки одного и того же изображения каждый раз)

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

Bassinator 08.08.2018 15:29

@Chris, я новичок, и это одно из моих первых приложений для Android, и я делаю это таким образом, чтобы понять, как программировать. Я знаю, что есть лучшая работа, чтобы сделать это профессионалами вроде вас, но я просто пытаюсь изучить это с помощью основ. Так что, если вы можете мне с этим помочь.

Syed Danish 09.08.2018 07:01

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

Bassinator 09.08.2018 14:57

Сложность заключается в следующих строках:

imageDownloader.execute(urls.get(i));
bitmaps.add(imageDownloader.getBitmap());

Поскольку ImageDownloader - это AsyncTask, он выполняется асинхронно в другом потоке, и к моменту вызова 2-й строки еще ничего не получено. Что вам действительно нужно сделать, так это переопределить AsyncTask # onPostExecute, где вы получите результат запроса (растровое изображение) и сможете отправить его адаптеру.

Другие вопросы по теме