Програмно добавяне на текстови изгледи в персонализиран адаптер на getView

Чудя се дали някой може да ми помогне или просто да знае дали това може да се направи. Имам персонализиран адаптер за ListView, където имам някои текстови изгледи, които винаги присъстват и съответстват на текстови изгледи в xml оформление, което се надува от адаптера за всеки ред. В допълнение към тези текстови изгледи също трябва да добавя някои текстови изгледи програмно за всеки ред в ListView. Всеки ред може да има различен брой текстови изгледи, които трябва да бъдат програмно добавени. Когато правя това, всеки път, когато превъртам нагоре и надолу изгледа на списъка, програмно добавените текстови изгледи се репликират и добавят към другите в реда, така че ако превъртя нагоре и надолу няколко пъти, просто имам куп дублиращи се текстови полета в всеки ред. В рамките на метода getView имам следния код за изтегляне на динамичната информация и добавяне на текстовите полета:

    Set recordDeailList = item.getRecordDetailList().keySet();
    Iterator<String> iterator = recordDeailList.iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            String value = item.getRecordDetailList().get(key);

            TextView textView = new TextView(RecordsFragment.this.getActivity());
            textView.setText(key + ": " + value);
            textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10.5f);

  );

            container.addView(textView);

        }

Благодаря, че проверихте това.


person Jaz    schedule 06.07.2013    source източник


Отговори (1)


Тъй като контейнерите, които се превъртат извън екрана, се кешират и използват повторно, вие добавяте още един текстов изглед към контейнера всеки път, когато извиквате своя getView().

Можете да преброите децата на вашия контейнер, да повторите списъка си и да добавите само ако childCount е достигнато

ако броят на децата все още не е достигнат, преброявате останалите (безполезни текстови изгледи) и извиквате setVisibility(View.GONE)

по този начин рано или късно ще стигнете до момент, в който почти всички контейнери имат еднакъв брой деца и няма да се добавят нови екземпляри

примерен код, който не съм тествал в момента:

Set recordDeailList = item.getRecordDetailList().keySet();
Iterator<String> iterator = recordDeailList.iterator();
int i = 0;
int childCount = container.getChildCount();
while (iterator.hasNext()) {
    String key = iterator.next();
    String value = item.getRecordDetailList().get(key);

    TextView textView;
    if (i < childCount) {
        //reuse existing textview
        textView = container.getChildAt(i);
    }
    else {
        // create new TextView and add
        textView = new TextView(RecordsFragment.this.getActivity());
        container.addView(textView);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10.5f);
    }
    textView.setText(key + ": " + value);


    i++;
}
while(i < childCount) {
    //hide useless children
    container.getChildAt(i).setVisibility(View.GONE);
    i++
}

редактиране: тъй като не е необходимо да задавате размера на текста всеки път, преместих повикването

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10.5f);

вътре в оператора else

person Christian R.    schedule 06.07.2013
comment
Благодаря, Крисчън, надявах се да избягам от брояча на гледанията на деца, но изглежда, че това е най-вероятното решение. Изглежда, че нещо подобно на вложени списъци не е възможно. Не бях сигурен дали има начин да не се извиква getview всеки път, когато се показва ролката или има начин да се запази списъкът в паметта ефективно. Благодаря - person Jaz; 06.07.2013
comment
@Jaz, както каза вложен списък, Google ме насочи към този въпрос: stackoverflow.com/questions /3135112/android-nested-listview и към ExpandableListAdapter с ExpandableListView - може би можете да го направите по този начин и аз ще редактирам отговора си - person Christian R.; 07.07.2013
comment
Крисчън, направих нещо подобно на решението, намерено на предоставената от теб връзка. Вместо да раздувам оформлението за ред, аз добавих оформлението и веднъж, след което преминах през записите и ги добавих към оформлението. Преди цикъла извиквам removeAllViews() в изгледа linearLayout, който съдържа всички програмно добавени изгледи. Изглежда, че работи добре. Благодаря за помощта. - person Jaz; 09.07.2013
comment
няма проблем, стига да не раздувате редовете си при всяко извикване на getView() и вместо това да използвате кеширани/обединени редове, трябва да сте добре - person Christian R.; 09.07.2013