notifyDataSetChanged()不会在绘制到LinearLayout的适配器上调用getView()

时间:2013-11-15 04:00:17

标签: android android-layout android-listview android-linearlayout android-adapter

我有一个源自ArrayAdapter的自定义适配器,它会覆盖我们称之为getView()的{​​{1}}。我手动将适配器创建的CustomObjectAdapter添加到LinearLayout,如下所示:

View

我使用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而不是使用View,因为我包含在ListView中,我希望整个区域可以滚动 - - 而不仅仅是Fragment内的区域。我在StackOverflow问题中找到了这个解决方案:Using a ListAdapter to fill a LinearLayout inside a ScrollView layout

在填充这些ListView的同一个类中,适配器的View方法中使用的数据会更新,然后我会调用getView()。但是,m_adapter.notifyDataSetChanged()函数随后不会被调用。在代码的另一个区域,我正在更新以相同方式(而不是getView())连接到ListView的适配器,并且它正在适当更新。有谁知道我做错了什么?

2 个答案:

答案 0 :(得分:1)

LinearLayouts不是为使用适配器而构建的。不调用getView的原因是因为没有连接到适配器的视图告诉它需要生成新视图。

在代码中,适配器和视图之间没有直接连接,就像在ListView上调用setAdapter时一样。就LinearLayout而言,其中的视图可能来自任何地方。类似地,适配器无法对其数据集发生更改的消息做任何事情,因为它没有连接到要求它生成视图的任何内容。

使用ListView重新生成视图,因为它向适配器注册DataSetObserver,然后在通过该观察者通知更改时从适配器请求新视图。

LinearLayout没有类似的机制,因此您唯一真正的选择是清空视图,并像最初一样手动重新输入。

答案 1 :(得分:1)

替代方案而不是解决方案,但您可以使用ListView中的addHeaderViewaddFooterView方法使非列表项也可以滚动。