Вопрос по android-listview, android, focus – ListView.hasWindowFocus == true, но дочерние представления hasWindowFocus == false

0

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

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

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

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

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

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

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

Ваш Ответ

1   ответ
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.

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

Похожие вопросы