Android从BaseExpandableListAdapter获取convertView

时间:2015-06-02 00:14:49

标签: android view expandablelistview expandablelistadapter

我需要调用BaseExpandableListAdapter方法

        @Override
        public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent)

或类似的东西,以获得该方法返回的视图。问题是,如果我调用该方法,我必须将null传递给convertView,这将重新定义视图,这是我需要的视图。

我需要视图,因为它包含一个自定义视图,其中包含我需要从中检索的代码,而无需将其重置为自身的新实例。以此方法为例:

        public ArrayList<CustomViewData> getCustomViewData ()
        {
            ArrayList<CustomViewData> customViewDatas = new ArrayList<>();
            for(int i = 0; i < getGroupCount(); i++)
                if(listView.isGroupExpanded(i))
                {
                    View v = //getConvertView
                    customViewDatas.add((CustomViewData) v.findViewById(R.id.customView);
                }
            return customViewDatas;
         }

如何在不创建新视图的情况下从ExpandableListView(或其基本适配器)获取实际视图?

2 个答案:

答案 0 :(得分:0)

永远不要存储Views生成的getView()。这是一种非常危险的做法。您有泄漏Views的风险。此外,适配器会在您滚动时回收Views,因此您存储的内容无法代表您所需的内容。

你在想错误的方向。适配器将数据绑定到Views。意思是,View的呈现方式基于数据本身。如果您因某些事件需要更新其中一个Views,则必须更新代表该View的数据。然后,适配器可以相应地重新呈现它View

解决此类问题时,请继续告诉自己&#34;如果我需要修改视图,那么我需要修改它的数据。&#34;

答案 1 :(得分:0)

这个问题的解决方案并不容易解决。

无法复制像ArrayAdapter的RecyclerView适配器功能。

相反,如果您需要从未自动存储的自定义视图中获取数据,请覆盖

@Override
public void onViewDetachedFromWindow (ViewHolder holder)
{
    //STORE VIEW DATA
    super.onViewDetachedFromWindow(holder);
}

@Override
public void onViewRecycled(ViewHolder holder)
{
    //STORE VIEW DATA
    super.onViewRecycled(holder);
}

使用这些方法从ViewHolder中存储的视图中获取数据。

完成回收站后,您必须从可见视图中获取数据。这些可见视图不会自动回收,因此您必须从仍在适配器上的可见视图中检索视图数据。

要执行此操作,请参阅this发布。