ListView getFirstVisiblePosition getFirstVisiblePosition значения getCount - PullRequest
0 голосов
/ 24 декабря 2011

У меня есть собственный класс ListView (подкласс из ListView), и мне нужно, чтобы он добавил небольшой отступ к нижней части конечного элемента представления, чтобы он не перекрывался маленькой полосой, которая расположена в нижней части экрана. , Я хочу делать это только тогда, когда дочерние представления растут за пределами видимой области списка. Я пытаюсь использовать этот код для достижения этого:

@Override
protected void onLayout (boolean changed, int left, int top, int right, int bottom) {
     super.onLayout(changed, left, top, right, bottom);

     // If there are hidden listview items we need to add a small padding to the last one so that it
     // partially hidden by the bottom sliding drawer handle
     if (this.getLastVisiblePosition() - this.getFirstVisiblePosition() + 1 > this.getCount()) {
         LinearLayout v2 = (LinearLayout) this.getChildAt(this.getCount() - 1);
         v2.setPadding(v2.getPaddingLeft(), v2.getPaddingTop(), v2.getPaddingRight(), 
                 v2.getPaddingBottom() + 5);
     }
 }

Однако значения, возвращаемые getLastVisiblePostion (), getFirstVisiblePostion () и getCount (), не отражают то, что адаптер пока содержит. Я предполагаю, что это потому, что Адаптер еще не уведомил ListView о данных, но я не могу понять, откуда ListView фактически знает о данных и, следовательно, имеет правильные значения. Этот код выполняется при загрузке Activity.

В какой момент процесса рендеринга у меня будет доступ к этим данным? Я также должен сказать, что я использую AsyncTask для загрузки данных из базы данных, а затем создаю там Адаптер и добавляю его в представление списка. Есть ли событие, которое я могу использовать в ListView, которое будет срабатывать, когда адаптер добавляет данные / заставляет представление списка отображать новые элементы?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2013

У меня была похожая проблема, когда getFirstVisiblePosition() вернул номер больше getCount().
Исправил это, вызвав listView.setAdapter(listView.getAdapter()).

0 голосов
/ 25 декабря 2011

Я не уверен, является ли это лучшим решением, но я знаю, что в одной из ветвей реализации «pull-to-refresh» для Android высота списка сравнивается с общей высотой всех элементов списка. , Из того, что вы говорите, похоже, что это та же информация, которую вы ищете, чтобы определить, применять ли дополнительный отступ или нет.

Соответствующие части реализации находятся в следующих трех методах:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (mHeight == -1) {  // do it only once
        mHeight = getHeight(); // getHeight only returns useful data after first onDraw()
        adaptFooterHeight();
    }
}

/**
 * Adapts the height of the footer view.
 */
private void adaptFooterHeight() {
    int itemHeight = getTotalItemHeight();
    int footerAndHeaderSize = mFooterView.getHeight()
        + (mRefreshViewHeight - mRefreshOriginalTopPadding);
    int actualItemsSize = itemHeight - footerAndHeaderSize;
    if (mHeight < actualItemsSize) {
        mFooterView.setHeight(0);
    } else {
        int h = mHeight - actualItemsSize;
        mFooterView.setHeight(h);
        setSelection(1);
    }
}

/**
 * Calculates the combined height of all items in the adapter.
 * 
 * Modified from http://iserveandroid.blogspot.com/2011/06/how-to-calculate-lsitviews-total.html
 * 
 * @return 
 */
private int getTotalItemHeight() {
    ListAdapter adapter = getAdapter();
    int listviewElementsheight = 0;
    for(int i =0; i < adapter.getCount(); i++) {
        View mView  = adapter.getView(i, null, this);
        mView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        listviewElementsheight+= mView.getMeasuredHeight();
    }
    return listviewElementsheight;
}

Полный исходный код можно найти здесь на GitHub.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...