当前位置: 首页 > wzjs >正文

做漆包线的招聘网站青海省住房和城乡建设厅网站

做漆包线的招聘网站,青海省住房和城乡建设厅网站,岳阳网站建设 熊掌号,深圳坪山网站建设公司最近接手了一个TV的应用,然后看到有些历史的崩溃。 其中top3有这样一个崩溃,但是被离职的前同事标记为不处理了。 崩溃是这样的: java.lang.NullPointerException: Attempt to invoke virtual method android.view.ViewGroup$LayoutParams a…

最近接手了一个TV的应用,然后看到有些历史的崩溃。
其中top3有这样一个崩溃,但是被离职的前同事标记为不处理了。
崩溃是这样的:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.ViewGroup$LayoutParams android.view.View.getLayoutParams()' on a null object reference
at androidx.recyclerview.widget.OrientationHelper$2.getDecoratedStart(Proguard:403)
at androidx.leanback.widget.GridLayoutManager.getViewMin
at androidx.leanback.widget.GridLayoutManager$2.getEdge(Proguard:1812)
at androidx.leanback.widget.Grid.removeInvisibleItemsAtEnd
at androidx.leanback.widget.GridLayoutManager.removeInvisibleViewsAtEnd(Proguard:1906)
at androidx.leanback.widget.GridLayoutManager.scrollDirectionPrimary(Proguard:2545)
at androidx.leanback.widget.GridLayoutManager.scrollVerticallyBy(Proguard:2487)
at androidx.recyclerview.widget.RecyclerView.scrollStep(Proguard:1974)
at androidx.recyclerview.widget.RecyclerView$ViewFlinger.run(Proguard:5476)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:727)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7661)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

issuetracker

issuetracker上显示已经修复了,更新日志中也可以看到这个的信息

https://issuetracker.google.com/issues/177338150
https://android-review.googlesource.com/c/platform/frameworks/support/+/2808353
https://developer.android.com/jetpack/androidx/releases/leanback?hl=zh-cn
https://developer.android.com/jetpack/androidx/releases/leanback?hl=zh-cn#leanback-grid_version_100_2

Version 1.2.0-alpha04
November 15, 2023androidx.leanback:leanback:1.2.0-alpha04 and androidx.leanback:leanback-preference:1.2.0-alpha04 are released. Version 1.2.0-alpha04 contains these commits.Bug Fixes(I2c3a0, b/292114537)
https://android-review.googlesource.com/#/q/I2c3a0f7ae43f72bd6a1dbbe30c269148f824a885
https://issuetracker.google.com/issues/292114537
Dependency UpdateUpdate recyclerview requirement to 1.3.2 to fix a common crash in TV apps

修复方法

dependencies {
def leanback_version = "1.2.0"
implementation "androidx.leanback:leanback:$leanback_version"
implementation "androidx.leanback:leanback-tab:1.1.0"
}

注意到这个升级了recyclerview到1.3.2之后。
compile_sdk_version 也需要升级到35,即 compileSdk 35

1.2.0 leanback ui 紊乱

本来上个小节之后,这篇博客应该就结束了。
但是我自测发现升级之后,列表刷新之后,出现了ui紊乱,即列表叠在一起。

项目中是如何做列表刷新的?

在 Android TV 开发中,Leanback 库的 DiffCallback 用于高效比较数据集合并更新 ArrayObjectAdapter 的内容,通常结合 setItems(List, DiffCallback) 方法使用。以下是其核心用法:


1. 作用

  • 高效更新列表:通过比较新旧数据集差异,仅更新变化的项(支持动画效果)。
  • 避免全量刷新:减少不必要的 UI 重绘,提升性能。

2. 实现步骤

a. 创建 DiffCallback 子类

继承 DiffCallback 并实现两个关键方法:

public class MyDiffCallback extends DiffCallback<YourItemType> {@Override
public boolean areItemsTheSame(YourItemType oldItem, YourItemType newItem) {
// 判断是否为同一个项(如唯一ID相同)
return oldItem.getId() == newItem.getId();
}@Override
public boolean areContentsTheSame(YourItemType oldItem, YourItemType newItem) {
// 判断内容是否相同(如字段值完全一致)
return oldItem.equals(newItem);
}@Optional @Override
public Object getChangePayload(YourItemType oldItem, YourItemType newItem) {
// 可选:返回变化的部分数据,用于局部更新
return super.getChangePayload(oldItem, newItem);
}
}
b. 使用 DiffCallback 更新数据

通过 ArrayObjectAdaptersetItems() 方法触发差异计算:

ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenter);
List<YourItemType> newItems = ...; // 新数据集// 更新数据并自动应用差异
adapter.setItems(newItems, new MyDiffCallback());

3. 示例场景

假设有一个 Movie 类作为数据项:

public class Movie {
private int id;
private String title;
private String description;// Getters & Setters...
}public class MovieDiffCallback extends DiffCallback<Movie> {
@Override
public boolean areItemsTheSame(Movie oldItem, Movie newItem) {
return oldItem.getId() == newItem.getId(); // ID 相同则为同一项
}@Override
public boolean areContentsTheSame(Movie oldItem, Movie newItem) {
return oldItem.getTitle().equals(newItem.getTitle())
&& oldItem.getDescription().equals(newItem.getDescription()); // 内容完全一致
}
}

4. 注意事项

  • 正确实现比较逻辑areItemsTheSame 应基于唯一标识符(如 ID),areContentsTheSame 判断数据是否变化。
  • 性能优化:避免在 areContentsTheSame 中进行耗时操作。
  • 支持局部更新:通过 getChangePayload 返回变化的部分数据,在 Presenter 中处理 onBindViewHolder 的局部更新。

UI错乱原因

项目中的 ConstraintLayout 中的view有点复杂,特别是在计算高度的时候,都是动态计算的。
在动画过程中,计算出来的结果出现了变化,所以导致了最终的效果是错乱的。

修复UI错乱的方法

  1. 和iOS一样,去掉动画,即 DiffCallback 传空进去。

  2. 重写 getChangePayload 和 public void onBindViewHolder(@NonNull ViewHolder viewHolder,@NonNull Object item,@NonNull List payloads) payloads变化的时候忽略 onBindViewHolder,然后定时400ms post一下,刷新列表。

  3. 固定View的高度、并且把高度依赖计算的view替换成 LinearLayout(或者其他容器)的子view

http://www.dtcms.com/wzjs/833835.html

相关文章:

  • 评价一个网站的优缺点网页设计 参考网站
  • 网站开发的软件支持建设银行个人网上银行登录入口
  • 营销型网站建设价格贵吗记账公司
  • 南京网站排名优化费用有哪些网络营销公司
  • 惠州仲恺住房和城乡建设局网站最近一周热点回顾
  • iis发布网站慢绍兴网络推广公司
  • 福永外贸网站建设公司外贸公司网页设计
  • 做网站时的注册权起到什么作用哪里网站建设公司好
  • 河西网站建设制作wordpress 子主题
  • 百度有没有做游戏下载网站吗淘宝运营的基础知识
  • 北京网站关键词优化推荐做一个谷歌网站多少钱
  • dw织梦做网站wordpress手机验证注册
  • 网络技术网站是做什么的制作灯笼作文
  • 网站建站服务公司地址微网站外链
  • 亚泰润德建设有限公司网站动态手机网站怎么做的
  • wordpress流量站网站维护包括哪些内容
  • 聊城市建设工程质量监督站网站无锡网站建设策划方案
  • 潍坊知名网站建设最新报价创建网站超市
  • 景观设计师如何做网站个人app
  • 网站开发开题报告怎么写网站分站的实现方法
  • 八宝山做网站的公司建设通网站是什么时间成立
  • 中建豪城建设有限公司网站烟台开发区网站建设
  • 广州外贸企业网站建设什么类型的网站好做
  • 仿win8 html5微网站纯手工代码app制作软件教程
  • 帮人做微信是哪个网站电子商务网站建设参考文献2018
  • 江苏做网站设计一个个人网站的基本步骤
  • 网站开发技术考试题目长沙网络营销群
  • 网站建设对帮助信息的设置云平台
  • 专门做顶账房的网站seo网络优化师就业前景
  • 在手机上怎么做网站企业网站ui设计欣赏