Android 从 BaseExpandableListAdapter 获取 convertView

Android get convertView from BaseExpandableListAdapter

我需要调用 BaseExpandableListAdapter 方法

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

或类似的东西来获取方法 returns 的视图。问题是,如果我调用那个方法,我必须将 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(或其基本适配器)获取实际视图?

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

你的思路错了。适配器将数据绑定到 Views。意思是,如何呈现 View 是基于数据本身。如果由于某些事件而需要更新 Views 之一...那么必须更新 View 的数据代表。然后适配器可以相应地重新呈现它的 View

解决此类问题时,不断告诉自己"If I need to modify the View, then I need to modify it's data."

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

无法复制 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 post。