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


мои вопросы:

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

8 ответов:

1: The 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() метод в адаптере предназначен для создания представления элемента a ListView,Gallery,...

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

  2. convertView для утилизации. Допустим, у вас есть listview, который может отображать только 10 элементов одновременно, и в настоящее время он есть пункт Показывать 1 -> пункт 10. При прокрутке вниз одного элемента, пункт 1 будет вне экрана, и пункт 11 будет отображаться. К создайте представление для элемента 11, будет вызван метод getView (), и convertView вот вид пункта 1 (который не является необходимым больше.) Поэтому вместо этого создайте новый объект представления для элемента 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. посмотрите на видео, поможет вам в курсе, что использование преобразования просмотр, в основном это переработанный вид, ожидающий повторного использования вами, чтобы избежать создания нового объекта и замедления прокрутки вашего списка.

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

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

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

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

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

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

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

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

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

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

  2. getView () вызывается много раз, в том числе при прокрутке. Поэтому, если у него уже есть завышенный вид, мы не хотим делать это снова, так как завышение является дорогостоящим процессом.. поэтому мы проверяем, если его значение 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() метод создания нового View или ViewGroup на каждой строке Listview или блесны . Вы можете определить это View или ViewGroup на на res/layout папка и может дать ссылку на нее Adapter объект класса.

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

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

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