问题描述
我正在尝试在 xamarin.android 中制作一个 imagevideoslider,我遇到了一些运行时视图删除和更新问题,例如 findviewwithtag 返回 null 而不是视图没有被正确删除,因为在搜索互联网后我从答案中得到了这个想法此线程列出所有视图
dynamically add and remove view to viewpager
现在假设我有 1000 个图像视图或视频视图或混合的列表/可观察集合。这种方法的内存效率是多少?这是一种不好的做法吗?
private ObservableCollection<java.lang.Object> _views = new ObservableCollection<java.lang.Object>();
View view = new View(_context);
if (con.MediaType.ToLower().Contains(Common.TYPE_IMAGE))
//MediaType.Image
{
view = new ImageView(_context);
((Activity)_context).RunOnUiThread(() =>
{
SetScaleType(ref view,con.ScaleType);
try
{
//implement ifileprovider
((ImageView)view).SetimageURI(Uri.Parse(con.LocalPath));
}
catch (Exception ex)
{
}
});
}
_views.add(view);
实例化项目方法
public override Object InstantiateItem(ViewGroup container,int position)
{
try
{
((Activity)_context).RunOnUiThread(() =>
{
container.AddView((View)_views[position],0);
if (position == 0)
{
OnPageSelected(0);
}
});
}
catch (Exception ex)
{
}
return _views[position];
}
销毁物品方法
public override void DestroyItem(ViewGroup container,int position,Object @object)
{
try
{
((Activity)_context).RunOnUiThread(() =>
{
View view = (View)@object;
((ViewPager)container).RemoveView(view);
view = null;
GC.Collect(GC.MaxGeneration,GCCollectionMode.Forced);
});
}
catch (Exception ex)
{
}
}
又来了!在代码中保留所有视图的列表然后从该列表中引用视图是一种不好的方法吗?
解决方法
ViewPager
& RecyclerView
仅实例化视口内的项目。
将所有视图保存在 ObservableCollection
中是一种糟糕的方法。如果你有10000次观看或100000次观看,你应该考虑问题吗?如果收到内存警告,系统将终止该应用程序。
从 RecyclerView document 开始,RecyclerView 提供了两个引人注目的功能::
它具有灵活的架构,可让您通过以下方式修改其行为 插入您喜欢的组件。
它对大型集合很有效,因为它重用项目视图 并且需要使用视图持有者来缓存视图引用。
默认情况下,RecyclerView 将重用视图,您不需要在运行时创建这么多视图。
我遇到了一些运行时视图删除和更新问题,例如 findviewwithtag 返回 null 而不是视图未被删除 正确
正确的方法是在需要时加载视图而不是同时加载它们。在ObservableCollection
中添加Views的数据,修改列表中的数据,而不是查找/修改views。更改数据后,刷新RecycleView。
比如要移除一个视图,可以移除ObservableCollection
中对应的数据,然后刷新RecycleView
,相应的视图也会被移除。