ListAsGridBaseAdapter отображает элементы сетки, только если их четное количество.

Я использую ListAsGridBaseAdapter для отображения элементов gridview с прокручиваемым заголовком сверху. В моем представлении сетки есть 2 столбца, и когда у меня есть нечетное количество элементов (например, 1 элемент) для отображения, в представлении сетки ничего не появляется, отображается только заголовок. Элементы отображаются только в том случае, если их четное количество (например, 2 или 4 элемента).

Я пытался отладить это некоторое время и не могу понять, что в code вызывает это.

РЕДАКТИРОВАТЬ: в сетке не отображаются n-е нечетные элементы для 1, 3, 5, 7 и 9 элементов сетки. Если у вас есть 10 или более элементов gridview, он отображает все элементы.

Отредактированная версия ListAsGridExampleAdapter.java приведена ниже:

public class ListAsGridExampleAdapter extends ListAsGridBaseAdapter {

    private List<Item> items = new ArrayList<Item>();
    private LayoutInflater inflater;
    private Context context;

    public ListAsGridAdapter(Context context) {
        super(context);
        this.context = context;
        inflater = LayoutInflater.from(context);

        items.add(new Item("item 1/5", "item", R.drawable.item_pic, 0, 0));
        items.add(new Item("item 2/5", "item", R.drawable.item_pic, 0, 0));
        items.add(new Item("item 3/5", "item", R.drawable.item_pic, 0, 0));
        items.add(new Item("item 4/5", "item", R.drawable.item_pic, 0, 0));
        items.add(new Item("item 5/5", "item", R.drawable.item_pic, 0, 0));
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    @Override
    protected View getItemView(int position, View view, ViewGroup viewGroup) {
        View item = view;
        if (view == null) {         
            item = inflater.inflate(R.layout.item_view, viewGroup, false);
            item.setTag(R.id.item_icon, item.findViewById(R.id.item_icon));
            item.setTag(R.id.item_title, item.findViewById(R.id.item_title));
        }
        Item currentItem = (Item)getItem(position);


        // Fill the view
        ImageView itemImage = (ImageView)item.getTag(R.id.item_icon);
        itemImage.setImageResource(currentItem.getIconID());

        // Item Name:
        TextView itemText = (TextView)item.getTag(R.id.item_title);
        itemText.setText(currentItem.getItemName());
        return item;
    }

Вот скриншот того, что отображается, как видно, отсутствует 5-й элемент: отсутствует 5-й элемент


person OpMt    schedule 28.07.2014    source источник
comment
Я на самом деле попробовал это, когда разрабатывал его, и он работал, четный элемент должен отображаться в отдельной строке.   -  person shalafi    schedule 28.07.2014
comment
@shalafi ты имеешь в виду странный элемент? Я сузил ошибку до метода createItemRow.   -  person OpMt    schedule 28.07.2014
comment
да, извините, странный элемент. Я только что проверил это, перекомпилировал, и у меня все заработало (см. ответ). Кроме того, если это ошибка, удобнее открыть проблему на github, чем спрашивать здесь (по крайней мере, для этого я получу уведомление)   -  person shalafi    schedule 28.07.2014
comment
@shalafi Я включил скриншот и немного другую версию ListAsGridExampleAdapter выше!   -  person OpMt    schedule 28.07.2014


Ответы (1)


Изменить: оказывается, что раздувание представления с родителем приводит к этой проблеме. Текущее решение (обходной путь) состоит в том, чтобы раздуть его, передав нулевой родитель.

Итак, это:

item = inflater.inflate(R.layout.item_view, viewGroup, false);

Должно быть:

item = inflater.inflate(R.layout.item_view, null);

Да, это ошибка, и я постараюсь исправить ее в будущем. Спасибо, что нашли!

Он работает с более чем 10 элементами, потому что при прокрутке представления перерабатываются адаптером, и поэтому родительский объект измеряется надлежащим образом.

Предыдущий ответ:

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

Может есть баг с конкретной настройкой по количеству колонок/элементов, но в принципе работает.

введите здесь описание изображения

person shalafi    schedule 28.07.2014
comment
Можете ли вы попробовать элементы с нечетным числом, такие как 1, 3 или 5 предметов. Я упомянул об этом в редактировании внизу вопроса. - person OpMt; 28.07.2014
comment
Я только что попробовал это с 5, и это сработало нормально (2 столбца). Ознакомьтесь с примером проекта и посмотрите, как он работает для вас. - person shalafi; 28.07.2014
comment
Я включил скриншот и немного другую версию ListAsGridExampleAdapter выше! - person OpMt; 28.07.2014
comment
Хорошо, я увеличил их с нулевым значением в качестве родителя, возможно, это имеет какое-то влияние (хотя правильный способ сделать это так же, как вы) - person shalafi; 28.07.2014
comment
Так есть ли проблема в моем модифицированном ListAsGridExampleAdapter? или это правильно, потому что я использовал его с вашим ListAsGridBaseAdapter. - person OpMt; 28.07.2014
comment
Теоретически это правильно и должно работать. Я бы попробовал передать нулевого родителя, чтобы увидеть, решил ли он проблему, поскольку это единственная разница. Если это так, я постараюсь исправить это, чтобы он работал как надо. - person shalafi; 28.07.2014
comment
Это исправило, знаете почему? - person OpMt; 28.07.2014
comment
Я думаю, что родительский макет имеет 0 высоты во время раздувания дочерних элементов, поэтому, если вы передадите null, они не будут принимать никаких ограничений, а если вы используете родительский элемент, высота будет равна 0. - person shalafi; 28.07.2014
comment
В любом случае, это ошибка, и я должен исправить это в будущем - person shalafi; 28.07.2014