Jak działa metoda getView () podczas tworzenia własnego niestandardowego adaptera?


102

Moje pytania to:

  1. Jaka jest dokładnie funkcja LayoutInflater?
  2. Dlaczego wszystkie artykuły, które przeczytałem, najpierw sprawdzają, czy Convertview ma wartość NULL, czy nie? Co to znaczy, kiedy jest zerowe, a co, kiedy nie jest?
  3. Jaki parametr nadrzędny akceptuje ta metoda?

Odpowiedzi:


115

1: plik LayoutInflater Pobiera pliki XML układu i tworzy różne obiekty widoku z jego zawartości.

2: Adaptery są zbudowane w celu ponownego wykorzystania widoków, gdy widok jest przewijany, tak że nie jest już widoczny, można go użyć do jednego z pojawiających się nowych widoków. Ten ponownie użyty widok to convertView. Jeśli ta wartość jest zerowa, oznacza to, że nie ma widoku z recyklingu i musimy utworzyć nowy, w przeciwnym razie powinniśmy go użyć, aby uniknąć tworzenia nowego.

3: parentjest dostarczany, abyś mógł zawyżać swój widok w celu uzyskania odpowiednich parametrów układu.

Wszystko to razem może posłużyć do efektywnego tworzenia widoku, który pojawi się na Twojej liście (lub innym widoku, który pobiera adapter):

public View getView(int position, @Nullable 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;
}

Zwróć uwagę na użycie LayoutInflater, który parentmoże być użyty jako argument, i jak convertViewjest używany ponownie.


5
Convertview == null jest użyteczny, gdy wszystkie twoje itens mają ten sam układ. Gdy na przykład musisz sprawdzić, czy nie ma opcji lub przycisku zaznaczonego i zmienić układ w oparciu o każdy element, musisz ponownie napełnić lub uzyskać widok z pamięci podręcznej.
sagits

Nie ma potrzeby ponownego napełniania. Po prostu musisz napisać switch lub if-else ladder w getview i zawyżać widoki zgodnie z twoim przypadkiem, nadpisać public int getItemViewType (int position) i public int getViewTypeCount (). @sagits
Prashanth Debbadwar

Jeśli instrukcje zwykle działają, ale podczas używania przycisków opcji, edycji tekstów i tego typu rzeczy, z którymi miałem kłopoty przy użyciu widoków z pamięci podręcznej, pojawia się kilka pytań dotyczących tego problemu przy przepełnieniu stosu.
sagits

71

getView()Sposób Adapter jest dla widoku elementu wytwarzającego Of A ListView, Gallery...

  1. LayoutInflaterjest używana do pobierania widoku obiektów, które można zdefiniować w xml układu (obiekt główny, normalnie LinearLayout, FrameLayoutlub RelativeLayout)

  2. convertViewsłuży do recyklingu. Powiedzmy, że masz widok listy, który może wyświetlać tylko 10 pozycji na raz, a obecnie wyświetla element 1 -> element 10. Kiedy przewiniesz w dół o jeden element, element 1 zniknie z ekranu i zostanie wyświetlony element 11 . Aby wygenerować widok dla elementu 11, zostanie wywołana metoda getView (), a convertViewtutaj jest widok elementu 1 (który nie jest już potrzebny). Więc zamiast tego utwórz nowy obiekt widoku dla pozycji 11 (co jest kosztowne), dlaczego nie użyć go ponownie convertView? => po prostu sprawdzamy, czy convertViewjest null, czy nie, jeśli null tworzy nowy widok, w przeciwnym razie użyj go ponownie convertView.

  3. parentViewjest ListView lub Galeria ... która zawiera widok elementu, który getView()generuje.

Uwaga : nie wywołujesz tej metody bezpośrednio, wystarczy ją zaimplementować, aby poinformować widok nadrzędny, jak wygenerować widok elementu.


2
DOSKONAŁE wyjaśnienie dla parentView, nie mogę znaleźć lepszego wyjaśnienia niż to, +1
Ahmed Adel Ismail

Niesamowite wyjaśnienie!
gabi

świetne wyjaśnienie +1
tpk

8

Możesz rzucić okiem na ten film o widoku listy. To z zeszłego roku Google IO i nadal najlepszy przegląd widoków list w moim umyśle.

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

  1. Wypełnia układy (pliki xml w twoim folderze res / layout /) do obiektów java, takich jak LinearLayout i inne widoki.

  2. Spójrz na wideo, zapewni Ci aktualne informacje o tym, do czego służy widok konwersji, w zasadzie jest to widok z recyklingu, który czeka na ponowne użycie, aby uniknąć tworzenia nowego obiektu i spowolnienia przewijania listy.

  3. Umożliwia odwoływanie się do widoku listy z karty.


5

Jaka jest dokładnie funkcja LayoutInflater?

Podczas projektowania w języku XML wszystkie elementy interfejsu użytkownika to tylko tagi i parametry. Zanim będziesz mógł użyć tych elementów UI (np. TextView lub LinearLayout), musisz utworzyć rzeczywiste obiekty odpowiadające tym elementom xml. Do tego służy inflater. Nadmuchiwacz używa tych tagów i odpowiadających im parametrów do tworzenia rzeczywistych obiektów i ustawiania wszystkich parametrów. Następnie możesz uzyskać odwołanie do elementu UI za pomocą findViewById ().

Dlaczego wszystkie artykuły, które przeczytałem, najpierw sprawdzają, czy Convertview ma wartość NULL, czy nie? Co to znaczy, kiedy jest zerowe, a co, kiedy nie jest?

To jest interesujące. Widzisz, getView () jest wywoływana za każdym razem, gdy rysowana jest pozycja na liście. Teraz, zanim element będzie można narysować, należy go utworzyć. Teraz convertView jest w zasadzie ostatnim widokiem używanym do rysowania elementu. W getView () najpierw wypełniasz xml, a następnie używasz findByViewID (), aby uzyskać różne elementy interfejsu użytkownika elementu listitem. Kiedy sprawdzamy (convertView == null) to, co robimy, to sprawdzanie, czy widok jest pusty (dla pierwszego elementu), a następnie go tworzymy, w przeciwnym razie, jeśli już istnieje, użyj go ponownie, nie ma potrzeby ponownego przechodzenia przez proces inflacji . Sprawia, że ​​jest o wiele bardziej wydajny.

Musiałeś również natknąć się na koncepcję ViewHolder w getView (). Dzięki temu lista jest bardziej wydajna. Tworzymy element widoku i przechowujemy odniesienie do wszystkich elementów interfejsu użytkownika, które otrzymaliśmy po zawyżeniu. W ten sposób możemy uniknąć wywoływania licznych funkcji findByViewId () i zaoszczędzić dużo czasu. Ten ViewHolder jest tworzony w warunku (convertView == null) i jest przechowywany w convertView przy użyciu metody setTag (). W pętli else otrzymujemy go z powrotem za pomocą metody getView () i używamy go ponownie.

Jaki parametr nadrzędny akceptuje ta metoda?

Element nadrzędny to ViewGroup, do którego ostatecznie dołączony jest widok utworzony przez getView (). Teraz w twoim przypadku byłby to ListView.

Mam nadzieję że to pomoże :)


4
  1. Inflator układu rozszerza się / dodaje zewnętrzny kod XML do bieżącego widoku.

  2. getView () jest wywoływana wiele razy, w tym podczas przewijania. Więc jeśli widok jest już zawyżony, nie chcemy tego robić ponownie, ponieważ nadmuchiwanie jest kosztownym procesem ... dlatego sprawdzamy, czy jest zerowy, a następnie nadmuchujemy.

  3. Widok nadrzędny to pojedyncza komórka Twojej listy.


3
Widok rodzica jest tutaj nieprawidłowo wyjaśniony. Będzie to ListView, a nie ListItem
Varun Jain

2

LayoutInflatersłuży do generowania dynamicznych widoków XML dla ListViewelementu lub wonCreateView fragmentu.

ConvertViewjest zasadniczo używany do odtwarzania widoków, których aktualnie nie ma w widoku. Powiedz, że masz element przewijany ListView. Podczas przewijania w dół lub w góręconvertView wyświetla widok, który został przewinięty. To ponowne użycie oszczędza pamięć.

Parametr nadrzędny getView()metody zawiera odwołanie do układu nadrzędnego, który ma listView. Załóżmy, że chcesz uzyskać identyfikator dowolnego elementu w nadrzędnym pliku XML, którego możesz użyć:

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

 }

1

getView()utwórz nowy Viewlub ViewGroupdla każdego wiersza Listviewlub Spinner. Możesz to zdefiniować Viewlub ViewGroupw Layout XMLpliku w res/layoutfolderze i podać odniesienie do niegoAdapter klasy Object.

jeśli masz 4 elementy w tablicy przekazanej do adaptera. getView()metoda utworzy 4 widoki dla 4 rzędów Adaper.

Klasa LayoutInflater ma metodę inflate (), która tworzy obiekt widoku z układu zasobów XML.


0

Przydatne informacje na temat getView można również znaleźć w interfejsie adaptera w pliku Adapter.java. To mówi;

/**
 * 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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.