2013-04-08 8 views
5

Czy istnieje sposób, aby uzyskać identyfikator zasobów (jak R.layout.viewtoInflate) z układu, z którego widok był zawyżone?Uzyskaj identyfikator zasobu, z którego widok był zawyżone

Próbuję zaimplementować widoku listy, który używa 2 niestandardowych układów dla elementów listy. Który układ elementów jest używany, opiera się na polu w obiektach używanych do wypełnienia widoku listy.

Co mi brakuje w moim niestandardowego adaptera jest sposobem, aby wiedzieć, co Resource „convertView” ja dostać w getView() była zawyżona z. Gdybym mógł uzyskać te informacje, mógłbym porównać i ustalić, czy mogę ponownie użyć widoku konwersji, czy też muszę go zastąpić odpowiednim układem dla bieżącego elementu.

więc idealnie byłoby coś takiego: Widoki

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 

    JSONObject currItem = mItems.getJSONObject(position); 

    int layoutType; 

    if (currItem.getBoolean("alternate")) 
     layoutType = R.layout.list_item_b; 
    else 
     layoutType = R.layout.list_item_a; 

    if (convertView == null || <convertView.resourceID> != layoutType) { 
     convertView = inflater.inflate(layoutType, null); 

     //Finish setting up new View and its holder 
    } 
    else { 
     //Get view holder for view reuse 
    } 

    //populate view with the required content 

    return convertView; 
} 

W najgorszym wypadku nie mogłem po prostu re-use w ogóle i po prostu napompować układ muszę za każdym razem, ale wydaje się bardzo rozrzutny.

Odpowiedz

5

Istnieje oficjalny sposób korzystania z wielu układów, po prostu przesuń getViewTypeCount() i getItemViewType(). Te metody informują adapter, aby oczekiwał wielu układów, a convertView zawsze będzie odpowiednim układem (więc nie trzeba sprawdzać identyfikatora zasobu). Aby uzyskać przykładowy kod, zobacz numer this example.

Ale jeśli chcesz dowiedzieć się, jakie jest układ, który po prostu sprawdzić na wyjątkowe cechy. Na przykład można użyć findViewById() w widoku, który istnieje tylko w jednym układzie, a następnie sprawdzić, czy zwraca on wartość null, czy też nie.

+0

Nie rozumiem, jak tęskniłem za funkcjonalnością wielu układów, ale dziękuję. Dziękuję również za sugestię znalezienia typu układu, który nie jest już potrzebny na razie, ale i tak dobrze wiedzieć. Mimo to wydaje mi się dziwne, że nie ma oficjalnego sposobu na uzyskanie układu zawyżonego widoku. – RobertoCuba

3

Widok listy obsługuje wiele układów - musisz zwrócić liczbę układów użytych w getViewTypeCount() i poprawić typ układu dla wiersza w getItemViewType().

Jeśli chcesz wiedzieć, z jakiego układu został nadmuchany, możesz dołączyć dowolne informacje do widoku, używając setTag() i pobrać później za pomocą getTag() - może to być Twój identyfikator układu lub cokolwiek innego.

-1

Jeśli prosisz o uzyskanie identyfikatora przedmiotów z układu, które zostały zawyżone. Wygląda to tak: -

//Suppose you have an TextView in the inflated layout of id textView1. Here you go 

convertView = inflater.inflate(layoutType, null); 
TextView tv = (TextView)convertview.findViewById(R.id.textView1); 
+0

W jaki sposób powyższy kod zwraca identyfikator nadmuchiwanego przedmiotu. findviewbyid zwraca tylko widok, a nie id –

1

Co zrobić, to zapisać identyfikator zasobu zawyżonego widoku w uchwycie widoku podczas tworzenia widoku. To pozwala mi uzyskać identyfikator zasobu układu podczas wypełniania widoków.

Mam nadzieję, że to pomoże.

Powiązane problemy