0

我有一个从我们将调用ArrayAdapter的覆盖派生的自定义适配器。我手动将适配器创建的 s 添加到 LinearLayout 中,如下所示:getView()CustomObjectAdapterView

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

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

4

2 回答 2

1

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

在您的代码中,适配器和视图之间没有直接连接,就像您调用setAdapterListView 时那样。就 LinearLayout 而言,其中的视图可能来自任何地方。同样,适配器无法对其数据集更改的消息真正做任何事情,因为它没有连接到任何要求它生成视图的东西。

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

LinearLayout 没有可比的机制,因此您唯一真正的选择是清空其中的视图,然后像最初一样手动将它们重新放入。

于 2013-11-15T04:44:05.007 回答
1

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

于 2013-11-15T04:49:50.553 回答