ListView.hasWindowFocus == true, но дочерние представления hasWindowFocus == false

Иногда я замечаю, что для View v

 - v.hasWindowFocus()==false
 - ((View)v.getParent()).hasWindowFocus())==true

Если я правильно понимаю документы, это никогда не должно иметь место.

v.getParent() является (подклассом) ListView

Любые идеи о том, что может быть причиной этого?

Примечание: я предполагаю, что это несоответствие hasWindowFocus является основной причинойЭта проблема

 Marc Van Daele29 июн. 2012 г., 12:58
Я использую пользовательский адаптер, содержащий массив Views. В getView (position, ...) я возвращаю View в указанной позиции. Очевидно, ListView не нравится это и иногда перерабатывает представления, которые не должны быть переработаны.
 Marc Van Daele29 июн. 2012 г., 12:20
очевидно, onWindowVisibilityChanged вызывается для этих представлений, несмотря на то, что они являются частью ListView

Ответы на вопрос(1)

Решение Вопроса

что ListView не похож на адаптер, имеющий массив представлений.

Таким образом, проблема вызвана кодом, как

public View getView (int position, View convertView, ViewGroup parent)
{
    return _views[position];
}

Просматривая код ListView (или, точнее, его метод AbsListView.obtainView родителей), вы увидите код, подобный

    if (scrapView != null) {
        ...
        child = mAdapter.getView(position, scrapView, this);
        ...
        if (child != scrapView) {
            mRecycler.addScrapView(scrapView);

Может случиться так, чтоgetView(position,...) вызывается с scrapView! = _views [position] и, следовательно, scrapView будет переработано. С другой стороны, вполне вероятно, что то же представление снова добавляется в ListView, в результате чего представления получают странные состояния.

Это должно быть исправлено в ListView IMO.

 07 нояб. 2012 г., 11:04
Это то, что я думал; Я смутно помнил, что у меня была такая же проблема, когда я делал это таким же образом в другом проекте. В любом случае, я попробую и посмотрю, что произойдет, спасибо!
 Marc Van Daele06 нояб. 2012 г., 20:24
обычно вы пишете что-то вроде View ret = convertView; if (ret == null) {ret = // создать представление; возможно, инфляция из XML, но может быть и в Java}; // (повторно) начать просмотр. Важно иметь (пере) init вне теста if, так как это должно быть сделано и при convertView! = Null
 06 нояб. 2012 г., 19:27
Это действительно полезно, спасибо. Причина, по которой я использую массив представлений, заключается в том, что я хочу иметь возможность смотреть в будущее и подготавливать представления перед их передачей в адаптер по соображениям производительности. Очевидно, что я могу загружать растровые изображения, не помещая их в представление, поэтому я все еще могу выполнять такую большую предварительную обработку, но как бы вы поступили с другими вещами & # x2014; с учетом того, что вы, вероятно, должны создавать представления на лету (из те, что переданыgetView(...) или такой)?

Ваш ответ на вопрос