安卓代码仿购物app首页
R.layout.activity_main愣了三秒。代码这玩意儿能撑起一个看起来像淘宝的仿购首页?显然不能。所以真正的首页工作从自定义RecyclerView开始。HomeAdapter,安卓继承RecyclerView.Adapter,代码但别急着塞数据。仿购首页的首页复杂在于多类型条目——轮播图、金刚区、安卓商品瀑布流、代码倒计时秒杀,仿购每种item的首页布局和逻辑都不一样。我建了个HomeItemType接口,安卓让每个条目自己返回布局ID和绑定逻辑。代码这招叫“策略模式”,仿购但写的时候没想那么多,纯粹觉得switch-case里写七八个case太痛苦。ViewPager2嵌套在RecyclerView里,滑动冲突得处理。我偷懒用了requestDisallowInterceptTouchEvent,但效果一般。后来改成自定义NestedScrollableHost,把触摸事件分发给子View,才算顺畅。这过程中最坑的是RecyclerView复用导致轮播图位置错乱,最后在onBindViewHolder里强制setCurrentItem并重置状态才解决。StaggeredGridLayoutManager,但图片加载是个坑。Glide加载网络图时,如果图片没缓存,item高度会跳动。我加了Glide.with(context).load(url).listener(),在图片加载完后再回调通知适配器刷新那一行。效果还行,但首次滑动还是会闪一下。Fragment切换,但首页Fragment里嵌套了太多滚动容器,返回时状态丢失。我干脆用FragmentManager的hide/show代替replace,这样view实例还在,滚动位置也保住了。代价是内存占用高一些,但用户体验优先。HomeDataRepository,用Handler.postDelayed模拟网络延迟。真正的难点在“加载更多”——上拉加载时,得在列表底部加个footer item,等新数据到了再移除。这个footer的type是TYPE_LOADING,我在adapter里判断getItemViewType时单独处理,否则会崩。app:layout_behavior,但自定义Behavior写起来太绕。最后简单粗暴:监听RecyclerView的滚动距离,超过阈值就把搜索框的translationY设为负值,让它看起来像是被顶上去的。虽然有点糙,但用户看不出来。ViewCompat.postOnAnimation延迟预加载下一张图,勉强能看。说真的,安卓碎片化问题在仿首页这种复杂布局上暴露得淋漓尽致。RecyclerView的onScrolled里访问了空对象。我在那个回调里加了if (layoutManager != null && adapter != null)的判空,问题消失。这种低级错误其实是最常见的,但debug时总想先怀疑框架。
-
上一篇
-
下一篇
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-