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。
我需要调用 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。