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

Мои вопросы:

What is exactly the function of the LayoutInflater? Why do all the articles that I've read check if convertview is null or not first? What does it mean when it is null and what does it mean when it isn't? What is the parent parameter that this method accepts?

Ответы на вопрос(8)

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

Why do all the articles that I've read check if convertview is null or not first? What does it mean when it is null and what does it mean when it isn't?

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

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

What is the parent parameter that this method accepts?

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

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

ых лет Google IO и до сих пор лучший просмотр списка просмотров в моей голове.

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

It inflates layouts (the xml files on your res/layout/ folder) into java Objects such as LinearLayout and other views.

Look at the video, will get you up to date with whats the use of the convert view, basically its a recycled view waiting to be reused by you, to avoid creating a new object and slowing down the scrolling of your list.

Allows you to reference you list-view from the adapter.

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

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

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

Решение Вопроса

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

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

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 используется повторно.

 08 мая 2015 г., 19:13
Если операторы обычно работают, но при использовании радиокнопок, редактирования текстов и тому подобного, с чем я столкнулся, возникли проблемы с использованием кэшированных представлений, то возникает ряд вопросов, касающихся этих вещей при переполнении стека.
 08 мая 2015 г., 08:36
Не нужно слишком перекачивать. Просто вам нужно написать переключатель или лестницу if-else в getview и раздуть представления в соответствии с вашим случаем, переопределить public int getItemViewType (int position) и public int getViewTypeCount (). @sagits
 16 апр. 2015 г., 16:30
Convertview == null полезен, когда все ваши itens имеют одинаковый макет. Когда вам нужно, например, проверить радио или проверенную кнопку и изменить макет на основе каждого элемента, вам нужно перефразировать, или он получит кэшированное представление.

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

 }

ера в файле 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);

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

LayoutInflater is used to get the View object which you define in a layout xml (the root object, normally a LinearLayout, FrameLayout, or RelativeLayout)

convertView is for recycling. Let's say you have a listview which can only display 10 items at a time, and currently it is displaying item 1 -> item 10. When you scroll down one item, the item 1 will be out of screen, and item 11 will be displayed. To generate View for item 11, the getView() method will be called, and convertView here is the view of item 1 (which is not neccessary anymore). So instead create a new View object for item 11 (which is costly), why not re-use convertView? => we just check convertView is null or not, if null create new view, else re-use convertView.

parentView is the ListView or Gallery... which contains the item's view which getView() generates.

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

 19 сент. 2015 г., 16:22
Удивительное объяснение!
 17 дек. 2013 г., 11:27
ОТЛИЧНОЕ объяснение для parentView, не могу найти лучшего объяснения, чем это, +1
 21 сент. 2016 г., 19:01
отличное объяснение +1

getView() is called numerous times including when scrolled. So if it already has view inflated we don't wanna do it again since inflating is a costly process.. thats why ,we check if its null and then inflate it.

The parent view is single cell of your List..

 29 нояб. 2014 г., 10:09
Родительский взгляд здесь объяснен неправильно. Это будет ListView, а не ListItem

Ваш ответ на вопрос