Слушатель будет уведомлен после обновления просмотра - PullRequest
0 голосов
/ 15 августа 2011

Мой проект до сих пор состоит из одного Activity, который загружает GridView, который заполняется расширенным BaseAdapter. Обычно представление обновляется путем вызова BaseAdapter.notifyDataSetChanged () из одного из моих объектов OnClickListener.

Моя проблема в том, что мне нужно запускать таймер при каждом обновлении представления. Я хочу сделать это только после полной перезагрузки представления.

Я не могу найти слушателя или метод, который я могу переопределить в API View или Adapter, чтобы выполнить это, хотя я предполагаю, что он есть. Самым близким, что я нашел, является BaseAdapter.registerDataSetObserver, хотя я не уверен, что это то, что я ищу.

Может кто-нибудь посоветовать, пожалуйста?

Спасибо

Ответы [ 2 ]

1 голос
/ 15 августа 2011

DataSetObserver не будет предоставлять функцию, которую вы ищете. В вашем адаптере попробуйте посмотреть getView () или ViewBinder.setViewBinder () (для классов Simple...Adapter), когда последнее представление заполнится данными, которые вы сможете примерно узнать, когда это будет сделано. .

0 голосов
/ 15 августа 2011

Я бы сказал, что лучше всего было бы создать внутренний класс anon из этого класса и добавить свою логику таймера с расширением GridView:

class AdapterDataSetObserver extends DataSetObserver {

    @Override
    public void onChanged() {

    }

    @Override
    public void onInvalidated() {

    }
}

(Вы можете получить доступ к этой переменной-членупоскольку это не является приватным):

/**
 * Should be used by subclasses to listen to changes in the dataset
 */
AdapterDataSetObserver mDataSetObserver;

Это метод, который вы должны переопределить (внутри gridview) (вам может потребоваться внести некоторые изменения, так как некоторые из этих переменных-членов могут быть приватными - mDataSetObserver isоднако нет:

@Override
public void setAdapter(ListAdapter adapter) {
    if (null != mAdapter) {
        mAdapter.unregisterDataSetObserver(mDataSetObserver);
    }

    resetList();
    mRecycler.clear();
    mAdapter = adapter;

    mOldSelectedPosition = INVALID_POSITION;
    mOldSelectedRowId = INVALID_ROW_ID;

    if (mAdapter != null) {
        mOldItemCount = mItemCount;
        mItemCount = mAdapter.getCount();
        mDataChanged = true;
        checkFocus();

        mDataSetObserver = new AdapterDataSetObserver();
        mAdapter.registerDataSetObserver(mDataSetObserver);

        mRecycler.setViewTypeCount(mAdapter.getViewTypeCount());

        int position;
        if (mStackFromBottom) {
            position = lookForSelectablePosition(mItemCount - 1, false);
        } else {
            position = lookForSelectablePosition(0, true);
        }
        setSelectedPositionInt(position);
        setNextSelectedPositionInt(position);
        checkSelectionChanged();
    } else {
        checkFocus();
        // Nothing selected
        checkSelectionChanged();
    }

    requestLayout();
} 

Найдите эти две строки в методе выше и расширьте свой класс здесь:

        mDataSetObserver = new AdapterDataSetObserver();
        mAdapter.registerDataSetObserver(mDataSetObserver);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...