我有一个源自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
的适配器,并且它正在适当更新。有谁知道我做错了什么?
答案 0 :(得分:1)
LinearLayouts不是为使用适配器而构建的。不调用getView
的原因是因为没有连接到适配器的视图告诉它需要生成新视图。
在代码中,适配器和视图之间没有直接连接,就像在ListView上调用setAdapter
时一样。就LinearLayout而言,其中的视图可能来自任何地方。类似地,适配器无法对其数据集发生更改的消息做任何事情,因为它没有连接到要求它生成视图的任何内容。
使用ListView重新生成视图,因为它向适配器注册DataSetObserver,然后在通过该观察者通知更改时从适配器请求新视图。
LinearLayout没有类似的机制,因此您唯一真正的选择是清空视图,并像最初一样手动重新输入。
答案 1 :(得分:1)
替代方案而不是解决方案,但您可以使用ListView
中的addHeaderView
和addFooterView
方法使非列表项也可以滚动。