
在我过去的一个项目中,我实施了一个“Time Picker Carousel”.它基于HorizontalScrollVIEw.用户可以在滚动此视图时选择时间.时间值是根据HorizontalScrollVIEw的X-Offset计算的.
我想在github上分享这个项目,但是在清理代码时我发现了一些糟糕的性能问题.
HorizontalScrollVIEw使用自定义ArrayAdapter填充. getVIEw()使用Holder作为convertVIEw.我认为它可能在ListVIEw中作为适配器工作,因此只有可见项才会被销毁并重新使用它们.相反,所有项目都呈现! (在我的情况下是1008!)我自己添加它们(代码示例中为#1),但是即使我尝试添加更少,从删除(和回收)旧的逻辑不起作用,或者我错过了什么?
所以我的基本问题是:我需要更改什么才能让我的适配器像ListVIEw一样?
>我发现this so link并尝试覆盖删除功能,但这从未被调用(不知何故逻辑,因为我只是添加)
>在github有一个很好的PagerAdapter example,但不知怎的,我无法将其转换为ArrayAdapter< String>
欢迎任何想法,链接!
请不要建议使用ListVIEw.我们决定使用HorizontalScrollVIEw因为回调以及我们在布局中已经有ListVIEw的事实.
HorizontalScrollVIEw
InfiniteTimeScrubberHorizontalVIEw extends horizontalscrollview{...public voID setAdapter(Context context, TimeScrubberlistadapter mAdapter) { this.mAdapter = mAdapter; try { fillVIEwWithAdapter(mAdapter); } catch (ZeroChildException e) { e.printstacktrace(); }}private voID fillVIEwWithAdapter(TimeScrubberlistadapter mAdapter) { //... VIEwGroup parent = (VIEwGroup) getChildAt(0); parent.removeAllVIEws(); for (int i = 0; i < mAdapter.getCount(); i++) { //#1: Here: ALL vIEws are added parent.addVIEw(mAdapter.getVIEw(i, null, parent)); }}Adpater
public class TimeScrubberlistadapter extends ArrayAdapter<String> {//...private ArrayList<String> List; //List from 0:00,0:30...23:00,23:30final static int MAXIMUM_DAYS = 21@OverrIDepublic int getCount() { return List.size() * MAXIMUM_DAYS;}@OverrIDepublic String getItem(int position) { return List.get(position % List.size());}@OverrIDepublic VIEw getVIEw(final int position, VIEw convertVIEw, VIEwGroup parent) { relativeLayout layout; if (convertVIEw == null) { layout = (relativeLayout) VIEw.inflate(context, layoutID, null); holder = new Holder(); holder.Title = (TextVIEw) layout.findVIEwByID(R.ID.epg_item_text); layout.setTag(holder); } else { layout = (relativeLayout) convertVIEw; vIEw = layout; holder = (Holder) layout.getTag(); } layout.setLayoutParams(mLP); String timeValue = getItem(position); holder.Title.setText(timeValue); return layout;}//...@OverrIDepublic voID remove(String object) { //not called...some how logic, because i do not remove an item super.remove(object); }解决方法:
我想也许你会混淆视图和适配器之间渲染的逻辑.使用适配器不会导致视图回收行为. ListVIEw本身及其父级AbsListVIEw实现了视图回收行为. ListVIEw需要适配器才能正确填充屏幕上显示的视图,但实际上选择显示哪些视图以及何时以及如何回收这些视图的逻辑根本不在适配器中.
如果你看一下HorizontalScrollView和ListView的源代码,你会发现它们是截然不同的.它们不同的方向不同.
因此,它的长短之处在于,您将无法通过使用HorizontalScrollVIEw甚至是简单的后代来获取您正在寻找的视图回收.如果您想要查看回收,请查看RecyclerView.
以上是内存溢出为你收集整理的android – HorizontalScrollView:带getView()的CustomAdapter不重用像ListView这样的convertViews全部内容,希望文章能够帮你解决android – HorizontalScrollView:带getView()的CustomAdapter不重用像ListView这样的convertViews所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)