В Android ListView, как я могу перебирать / манипулировать всеми дочерними представлениями, а не только видимыми? - PullRequest
10 голосов
/ 22 января 2010

Приведенный ниже код НЕ изменяет текст всех строк ListView's, поскольку getChildCount() получает не все строки ListView's, а только видимые строки.

for (int i = 0; i < listView.getChildCount(); i++)
{
    View v = listView.getChildAt(i);
    TextView tx = (TextView) v.findViewById(R.id.mytext);
    tx.setTextSize(newTextSize);
}

Итак, что я должен делать?

Есть ли код для получения уведомления, когда строка ListView's становится видимой, чтобы я мог тогда установить размер текста?

Ответы [ 3 ]

15 голосов
/ 22 января 2010

В ListView единственные дочерние элементы являются видимыми. Если вы хотите что-то сделать со «всеми детьми», сделайте это в адаптере. Это лучшее место.

9 голосов
/ 22 января 2010

List13 из демонстраций API делает нечто подобное, используя OnScrollStateChanged. Возможно, есть лучший способ:

public void onScrollStateChanged(AbsListView view, int scrollState) {
    switch (scrollState) {
    case OnScrollListener.SCROLL_STATE_IDLE:
        mBusy = false;

        int first = view.getFirstVisiblePosition();
        int count = view.getChildCount();
        for (int i=0; i<count; i++) {
            TextView t = (TextView)view.getChildAt(i);
            if (t.getTag() != null) {
                t.setText(mStrings[first + i]);
                t.setTag(null);
            }
        }

        mStatus.setText("Idle");
        break;

. , ,

РЕДАКТИРОВАТЬ Кори Trager:

Вышесказанное определенно указало мне в правильном направлении. Я обнаружил, что обработка OnScrollListener.onScroll работает лучше, чем onScrollStateChanged. Даже если я удалил оператор case в onScrollSgtaetChanged и обработал каждое изменение состояния, некоторый текст не изменился. Но с OnScroll, кажется, все работает.

Итак, мой, казалось бы, рабочий код выглядит так:

public void onScroll(AbsListView v, int firstVisibleItem, int visibleCount, int totalItemCount)
{
    ListView lv = this.getListView();
    int childCount = lv.getChildCount();

    for (int i = 0; i < childCount; i++)
    {
        View v = lv.getChildAt(i);
        TextView tx = (TextView) v.findViewById(R.id.mytext);
        tx.setTextSize(textSize);
    }
}
0 голосов
/ 25 апреля 2016

Не уверен насчет эффекта производительности, но вы можете попробовать это.

//declare the list
ListView list = (ListView)findViewById(R.id.yourListID);

// in my case i have spinners and made a test just to know if this works
 Spinner spnWhatever;
 View view;
 int i =0;


       do{

           view =list.getAdapter().getView(i,null,null);
           //get the spinners from each row
           spnWhatever =(Spinner)view.findViewById(R.id.spnTarifas);

        i++;

       }while(list.getAdapter().getCount() !=i);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...