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

мои вопросы:

  1. какова именно функция LayoutInflater?
  2. почему все статьи, которые я прочитал, проверяют, является ли convertview нулевым или нет? Что это значит, когда это null и что это значит, когда это не так?
  3. каков Родительский параметр, который принимает этот метод?

8 ответов


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

2: адаптеры построены для повторного использования представлений, когда представление прокручивается так, что больше не видно, его можно использовать для одного из новых представлений. Этот повторно используемый вид является 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 используется повторно.


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

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

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

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

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


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

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

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

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

  3. позволяет ссылаться на просмотр списка из адаптера.


какова именно функция LayoutInflater?

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

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

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

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

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

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

надеюсь, что это помогает :)


  1. Layout inflator раздувает / добавляет внешний XML к вашему текущему представлению.

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

  3. родительское представление является одной ячейкой вашего списка..


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;
    }

 }

getView() метод create new View или ViewGroup на каждой строке Listview или блесны . Вы можете определить это View или ViewGroup на на res/layout папка и может дать ссылку на Adapter объект класса.

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

класс LayoutInflater имеет метод inflate (), который создает объект представления из макета ресурса XML.


вы также можете найти полезную информацию о getView адаптера на адаптер в адаптер.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's 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);