Как работает метод getView() при создании собственного адаптера?

Мои вопросы:

  • Что такое функция LayoutInflater?
  • Почему все прочитанные статьи проверяют, является ли преобразование в null или не первым? Что это означает, когда оно равно null и что это значит, когда это не так?
  • Что такое родительский параметр, который принимает этот метод?

Ответ 1

1: LayoutInflater принимает ваши XML файлы макета и создает из его содержимого разные объекты View.

2: Адаптеры построены для повторного использования представлений, когда прокрутка View прокручивается, чтобы ее больше не было видно, ее можно использовать для одного из новых представлений. Этот повторно используемый вид является convertView. Если это null, это означает, что нет переработанного представления, и мы должны создать новый, иначе мы должны использовать его, чтобы избежать создания нового.

3: parent предоставляется, чтобы вы могли раздуть ваш взгляд на него для правильных параметров компоновки.

Все эти вместе могут быть использованы для эффективного создания представления, которое будет отображаться в вашем списке (или другом представлении, которое берет адаптер):

public View getView (int position, View convertView, ViewGroup parent){
    if( convertView == null ){
        //We must create a View:
        convertView = inflater.inflate(R.layout.my_list_item, parent, false);
    }
    //Here we can do changes to the convertView, such as set a text on a TextView 
    //or an image on an ImageView.
    return convertView;
}

Обратите внимание на использование LayoutInflater, что parent может использоваться как аргумент для него и как convertView повторно используется.

Ответ 2

getView() метод в Adapter предназначен для создания представления элемента ListView, Gallery,...

  • LayoutInflater используется для получения объекта View, который вы определяете в макете xml ( корневой объект, обычно LinearLayout, FrameLayout или RelativeLayout)

  • convertView предназначен для утилизации. Скажем, у вас есть список, который может отображать только 10 элементов за раз, и в настоящее время это отображение элемента 1 → элемент 10. При прокрутке вниз по одному элементу элемент 1 будет недоступен, и будет отображаться элемент 11. к создать представление для элемента 11, будет вызван метод getView() и convertView здесь представлен вид пункта 1 (который не является обязательным больше). Поэтому вместо этого создайте новый объект View для элемента 11 (который дорого), почему бы не повторно использовать convertView? = > мы просто проверяем convertView на null или нет, если null создает новый вид, повторите использование convertView.

  • parentView - это представление, в котором содержится представление элемента, которое getView() генерирует. Обычно это ListView или Gallery...

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

Ответ 3

Вы можете посмотреть это видео о просмотре списка. Его с прошлых лет Google IO и по-прежнему лучшая прогулка по спискам в моем сознании.

http://www.youtube.com/watch?v=wDBM6wVEO70

  • Он раздувает макеты (файлы xml в папке res/layout/folder) в java-объекты, такие как LinearLayout и другие представления.

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

  • Позволяет ссылаться на ваш список-список из адаптера.

Ответ 4

Что такое функция LayoutInflater?

При разработке с использованием XML все ваши элементы пользовательского интерфейса представляют собой только теги и параметры. Прежде чем вы сможете использовать эти элементы пользовательского интерфейса (например, TextView или LinearLayout), вам необходимо создать фактические объекты, соответствующие этим элементам xml. Для этого нужен раздув. Надуватель использует эти теги и их соответствующие параметры для создания реальных объектов и установки всех параметров. После этого вы можете получить ссылку на элемент пользовательского интерфейса, используя findViewById().

Почему все прочитанные статьи проверяют, является ли преобразование в null или не первым? Что это означает, когда оно равно null и что это значит, когда это не так?

Это интересно. Видите ли, getView() вызывается каждый раз, когда элемент в списке рисуется. Теперь, прежде чем элемент может быть нарисован, он должен быть создан. Теперь convertView в основном является последним используемым видом для рисования элемента. В getView() вы сначала раздуваете xml, а затем используете findByViewID(), чтобы получить различные элементы пользовательского интерфейса в списке. Когда мы проверяем (convertView == null), что мы делаем, проверяем, что если представление равно null (для первого элемента), тогда создайте его, иначе, если он уже существует, повторно его использовать, нет необходимости снова проходить процесс наполнения, Это делает его намного более эффективным.

В getView() вы также должны были увидеть концепцию ViewHolder. Это делает список более эффективным. Что мы делаем, так это создание зрителя и сохранение ссылки на все элементы пользовательского интерфейса, которые мы получили после раздувания. Таким образом, мы можем избежать вызова многочисленных findByViewId() и сэкономить много времени. Этот ViewHolder создается в состоянии (convertView == null) и сохраняется в convertView с помощью setTag(). В цикле else мы просто возвращаем его с помощью getView() и повторно используем его.

Каков родительский параметр, который принимает этот метод?

Родитель - это ViewGroup, к которой наконец добавлено ваше представление, созданное getView(). Теперь в вашем случае это будет ListView.

Надеюсь, что это поможет:)

Ответ 5

  • Развертывание инфлятора раздувает/добавляет внешний XML в ваш текущий вид.

  • getView() вызывается много раз, в том числе при прокрутке. Так что, если у него уже есть вид завышенного, мы не хотим делать это снова, так как надувание - дорогостоящий процесс. Вот почему мы проверяем, не имеет ли значение null, а затем раздувает его.

  • Родительский вид - это одиночная ячейка вашего списка.

Ответ 6

LayoutInflater используется для создания динамических представлений XML для элемента ListView или в onCreateView фрагмента.

ConvertView в основном используется для повторной обработки представлений, которые в настоящее время не отображаются. Скажем, у вас есть прокручиваемый ListView. При прокрутке вниз или вверх, ConvertView отображает прокрутку. Это повторное использование сохраняет память.

Родительский параметр метода getView() дает ссылку на родительский макет, который имеет listView. Скажем, вы хотите получить идентификатор любого элемента в родительском XML, который вы можете использовать:

ViewParent nv = parent.getParent();

while (nv != null) {

    if (View.class.isInstance(nv)) {
        final View button = ((View) nv).findViewById(R.id.remove);
        if (button != null) {
            // FOUND IT!
            // do something, then break;
            button.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Log.d("Remove", "Remove clicked");

                    ((Button) button).setText("Hi");
                }
            });
        }
        break;
    }

 }

Ответ 7

getView() создайте новый View или ViewGroup для каждой строки Listview или Spinner. Вы можете определить этот View или ViewGroup в файле Layout XML в папке res/layout и дать ссылку на Adapter класс Object.

если у вас есть 4 элемента в массиве, переданном адаптеру. getView() метод создаст 4 вида для 4 рядов Adaper.

В классе LayoutInflater есть метод inflate(), который создает View Object из макета ресурса XML.

Ответ 8

Вы также можете найти полезную информацию о getView на интерфейсе Adapter в файле Adapter.java. Он говорит:

    /**
 * Get a View that displays the data at the specified position in the data set. You can either
 * create a View manually or inflate it from an XML layout file. When the View is inflated, the
 * parent View (GridView, ListView...) will apply default layout parameters unless you use
 * {@link android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)}
 * to specify a root view and to prevent attachment to the root.
 * 
 * @param position The position of the item within the adapter data set of the item whose view
 *        we want.
 * @param convertView The old view to reuse, if possible. Note: You should check that this view
 *        is non-null and of an appropriate type before using. If it is not possible to convert
 *        this view to display the correct data, this method can create a new view.
 *        Heterogeneous lists can specify their number of view types, so that this View is
 *        always of the right type (see {@link #getViewTypeCount()} and
 *        {@link #getItemViewType(int)}).
 * @param parent The parent that this view will eventually be attached to
 * @return A View corresponding to the data at the specified position.
 */
View getView(int position, View convertView, ViewGroup parent);