Несколько bitmap внутри ListView. Разобраться с getView.

Интерфейс, диалоги, темы, стили, меню
Ответить
Азимут
Сообщения: 1
Зарегистрирован: 07 апр 2014, 16:47

Несколько bitmap внутри ListView. Разобраться с getView.

Сообщение Азимут » 28 ноя 2015, 13:50

Пожалуйста, помогите разобраться с getView.

Примерная постановка задачи: отображение списка элементов внутри которого должно быть произвольное количество фотографий (например пост ВКонтакте).
Сначала сделал стандартно через BaseAdapter отображение одной фотографии.

item.xml

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tvDescr"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text=""
        android:textSize="20sp"></TextView>

    <ImageView
        android:id="@+id/ivImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"></ImageView>
</LinearLayout>

Код: Выделить всё

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.item, parent, false);
        }

        Product p = getProduct(position);
        ((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
        ImageView imageView = (ImageView) view.findViewById(R.id.ivImage);
        imageView.setImageBitmap(p.bm);
        return view;
    }
Все работает замечательно.
Вычитал, что если добавлять произвольное количество ImageView, то нужно это делать вручную.

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tvDescr"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text=""
        android:textSize="20sp"></TextView>

    <LinearLayout
        android:id="@+id/imageBox"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"></LinearLayout>
</LinearLayout>

Код: Выделить всё

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.item_multi, parent, false);
        }

        Product p = getProduct(position);
        ((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);

        ImageView imageView = new ImageView(ctx);
        imageView.setLayoutParams(new GridView.LayoutParams(105, 105));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(8, 8, 8, 8);
        imageView.setImageBitmap(p.bm);
        ViewGroup imageBox = (ViewGroup) view.findViewById(R.id.imageBox);
        imageBox.addView(imageView);
        return view;
    }
Отображается: в первом элементе сразу две фото, во втором две одинаковых и еще две других, в третей три одинаковых фото.

Переписываю так, что бы создавать ImageView только когда convertView == null:

Код: Выделить всё

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.item_multi, parent, false);
            Product p = getProduct(position);

            ImageView imageView = new ImageView(ctx);
            imageView.setLayoutParams(new GridView.LayoutParams(220, 220));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
            imageView.setImageBitmap(p.bm);
            ViewGroup imageBox = (ViewGroup) view.findViewById(R.id.imageBox);
            imageBox.addView(imageView);
        }
        return view;
    }
Теперь в каждом элементе по одной фото, но не все, которые должны быть загружены, а только первые четыре, которые идут в случайном порядке (как раз четыре и помещаются на экране. Подозреваю, что все это происходит из-за не понимания работы getView.

Ответить