Невозможно сделать ImageView одного элемента в ListView невидимым - PullRequest
0 голосов
/ 08 апреля 2011

У меня есть строка для ListView, определенная как:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    <TextView
        android:id="@+id/menutext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="24sp"
        android:layout_alignParentLeft="true"/>
    <ImageView
        android:id="@+id/icon"
        android:layout_width="40dip"
        android:layout_height="40dip"
        android:src="@drawable/lock"
        android:layout_gravity="right"
        android:layout_alignParentRight="true"/>
</LinearLayout>

Мой адаптер для ListView установлен в onCreate()

    listView.setAdapter(new ArrayAdapter<String>(this, R.layout.send_menu_row, R.id.menutext, items));

У меня есть 5 строк с текстом иизображение на каждом ряду.В onResume() я хочу сделать ImageView первой строки невидимым.

@Override
protected void onResume()
{
    super.onResume();
    LinearLayout linLayout = (LinearLayout) listView.getAdapter().getView(0, null, null);
    ImageView v = (ImageView) linLayout.getChildAt(1);
    v.setVisibility(View.INVISIBLE);
}

Но это не меняет видимость.Может ли кто-нибудь помочь мне в этом?

Ответы [ 3 ]

2 голосов
/ 08 апреля 2011

Вероятно, происходит то, что вы не делаете это правильным способом.

Попробуйте переключить ориентацию устройства с горизонтальной на вертикальную (или наоборот).Это должно инициировать вызов метода onResume, и он может работать.

В любом случае скрытие изображения не должно выполняться таким образом .Возможно, вам следует использовать пустое изображение или переопределить метод getView (в адаптере).

ОБНОВЛЕНИЕ - почему я говорю, что вы не должны использовать этот метод для этого

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

Этот метод может быть переопределен разработчиком для рисования пользовательских / сложных представлений, но он должен использоваться (как в, вызывается) исключительноsystem.

Например, когда мы говорим о длинных списках, при прокрутке у вас будет вызван метод getView, и он получит представление, которое можно использовать повторно (что намного эффективнее),Это означает, что если вы настаиваете на том, что первое представление будет невидимым, когда вы прокручиваете и первое представление используется повторно для отображения 20-го элемента (например), теперь 20-й элемент будет невидимым, поскольку, вероятно, вы просто обновите меткуи источник изображения.

Примечание:

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

Что происходит:

Я думаю, что получил его сейчас,Я полагаю, что происходит следующее:

Когда упражнение изначально нарисовано, у вас будет метод getView, вызываемый 5 раз (по одному для каждого отображаемого элемента).Каждый раз, когда ОС собирает возвращаемое представление и добавляет его в представление списка.

Позднее вы сами вызовете getView.Поскольку вы не передаете ни одно представление для повторного использования, метод создаст другое представление и вернет его.Чем отличается на этот раз?Вы не добавляете это представление в просмотр списка.(Кроме того, это не то, что вам нужно делать.)

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

Решение переопределяет getView или использует прозрачное изображение (проще).

Вот ссылка на первый результат в Google: http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/

2 голосов
/ 08 апреля 2011

Как насчет переопределения getView, а затем выполнения setVisibility при возврате первой строки в getView ()?

Не рекомендуется изменять строки вне адаптера списка.Так как каждый раз, когда пользователь прокручивает, вы потеряете изменения.

0 голосов
/ 08 апреля 2011

Обходной путь может быть?

Попробуйте сделать прозрачное изображение (png) и поместите его в качестве первого элемента :-)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...