Несколько bitmap внутри ListView. Разобраться с getView.
Добавлено: 28 ноя 2015, 13:50
Пожалуйста, помогите разобраться с getView.
Примерная постановка задачи: отображение списка элементов внутри которого должно быть произвольное количество фотографий (например пост ВКонтакте).
Сначала сделал стандартно через BaseAdapter отображение одной фотографии.
item.xml
Все работает замечательно.
Вычитал, что если добавлять произвольное количество ImageView, то нужно это делать вручную.
Отображается: в первом элементе сразу две фото, во втором две одинаковых и еще две других, в третей три одинаковых фото.
Переписываю так, что бы создавать ImageView только когда convertView == null:
Теперь в каждом элементе по одной фото, но не все, которые должны быть загружены, а только первые четыре, которые идут в случайном порядке (как раз четыре и помещаются на экране. Подозреваю, что все это происходит из-за не понимания работы 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;
}