Установка видимых для элементов, которые раньше были невидимы в GridView - PullRequest
3 голосов
/ 11 ноября 2011

У меня есть GridView, в котором я хочу всегда отображать 7 значков, а иногда и дополнительный значок в зависимости от запроса.В начале дополнительный значок никогда не отображается.Это структура:

0   1   2
3   4   5
6  [7]

Все значки вписываются в экран, поэтому мне не нужна прокрутка.Каждый значок состоит из изображения и текста.

Для этого у меня есть CustomAdapter, который расширяет BaseAdapter.Я переопределил метод getView, в котором я устанавливаю текст и изображение для каждого значка.

public View getView(int position, View convertView, ViewGroup parent) {
    View v = null;

    if (convertView == null) {
        LayoutInflater li = ((Activity) context).getLayoutInflater();
        v = li.inflate(R.layout.icon, null);
    } else {
        v = convertView;
    }

    TextView tv = (TextView) v.findViewById(R.id.icon_textView);
    tv.setText(position);
    ImageView iv = (ImageView) v.findViewById(R.id.icon_ImageView);
    iv.setImageResource(imageResourcesArray[position]);

    if ((position == ADDITIONAL_ICON)) && !showAdditionalIcon) {
        v.setVisibility(View.INVISIBLE);
    }

    return v;
}

imageResourcesArray[] - это массив целых чисел с ресурсами изображения.Другие функции и переменные в CustomAdapter:

public static final int ADDITIONAL_ICON = 7;
private boolean showAdditionalIcon = false;

public showAdditionalIcon(){
    this.showAdditionalIcon = true;
    notifyDataSetChanged();
    // notifyDataSetInvalidated();
}

public hideAdditionalIcon(){
    this.showAdditionalIcon = false;
    notifyDataSetChanged();
    // notifyDataSetInvalidated();
}

Позже я создаю и устанавливаю CustomAdapter для GridView из класса, который расширяет Activity (скажем, ClassA):

    GridView grid = (GridView) findViewById(R.id.main_gridView);
    customAdapter = new CustomAdapter(this);
    grid.setAdapter(customAdapter);

Моя проблема возникает, когда после некоторых вычислений и запросов к серверу я должен показать дополнительный значок (номер 7).Поэтому я звоню (от ClassA):

    customAdapter.showAdditionalIcon();

Теперь появляется дополнительный значок, но первый значок исчезает ... Я пытался использовать notifyDataSetInvalidated() и notifyDataSetChanged(), но оба имелитот же результат.

Конечно, я мог бы сгенерировать новый CustomAdapter с разрешенным дополнительным значком, но я бы предпочел не делать этого ...

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

1 Ответ

1 голос
/ 11 ноября 2011

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

Это означает, что представление, которое мы связали с позицией 7, когда мы визуализируем весь этот сценарий, фактически повторно используется позже в позиции 0. Поскольку ваш код явно не сбрасывает представление, чтобы оно было видимым, представление будет повторно использовано.с видимостью, установленной в НЕВИДИМОЕ, ​​таким образом, загадка исчезающего первого элемента.

Самое простое решение должно быть, как предложено @Vinay выше, явно установив View.VISIBLE.

if ((position == ADDITIONAL_ICON))) {
    if (!showAdditionalIcon)
        v.setVisibility(View.INVISIBLE);
    else
        v.setVisibility(View.VISIBLE);
}

Надеюсь, что этопомогает, но я действительно надеюсь, что некоторые эксперты Android откроют нам больше о том, как на самом деле работает повторное использование старых представлений.

...