notifyDataSetChanged() не вызывает getView() для адаптера, который рисует LinearLayout

У меня есть собственный адаптер, производный от ArrayAdapter, который переопределяет getView(), который мы назовем CustomObjectAdapter. Я вручную добавляю Views, созданные адаптером, в LinearLayout, как показано ниже:

m_adapter = new CustomObjectAdapter(this.getApplicationContext(), 
                                    R.layout.custom_object_layout, 
                                    m_customObjectArrayList);
m_linearLayout = (LinearLayout)findViewById(R.id.custom_object_list_linear_layout);

for (int i = 0; i < m_adapter.getCount(); i++) {
    // Create the view for the custom object
    View view = m_adapter.getView(i, null, null);
    m_linearLayout.addView(view);
}

Я заполняю LinearLayout Views вместо использования ListView, потому что он содержится в Fragment, в котором я хочу, чтобы вся область прокручивалась, а не только область внутри ListView. Я нашел это решение в этом вопросе StackOverflow: Использование ListAdapter для заполнения LinearLayout внутри макета ScrollView.

В том же классе, в котором заполняются эти View, данные, используемые в методе адаптера getView(), обновляются, а затем я вызываю m_adapter.notifyDataSetChanged(). Однако функция getView() впоследствии не вызывается. В другой области кода я обновляю адаптер, который подключен к ListView таким же образом (вместо LinearLayout), и он обновляется соответствующим образом. Кто-нибудь знает, что я делаю неправильно?


person jokeefe    schedule 15.11.2013    source источник


Ответы (2)



LinearLayouts не созданы для использования адаптеров. Причина, по которой getView не вызывается, заключается в том, что к адаптеру не подключено представление, сообщающее ему о необходимости создания новых представлений.

В вашем коде нет прямой связи между адаптером и представлением, как при вызове setAdapter в ListView. Что касается LinearLayout, представления в нем могут поступать откуда угодно. Точно так же адаптер ничего не может сделать с новостями о том, что его набор данных изменился, потому что он не подключен ни к чему, что требует от него создания представлений.

Представления регенерируются вместе с ListView, поскольку он регистрирует DataSetObserver с помощью адаптера и затем запрашивает новые представления у адаптера, когда получает уведомление об изменениях через этого наблюдателя.

Для LinearLayout нет сопоставимого механизма, поэтому ваш единственный реальный вариант - очистить его от представлений и снова добавить их вручную, как вы делали изначально.

person blahdiblah    schedule 15.11.2013