fragment和Activity同时操作UI引起的延迟、卡顿

最近项目中遇到一个问题,app首页的Activity中由若干个Fragment页面组成,其中一个fragment页面是由一个GridView和ListView组成的列表,如果列表中数据量过大的时候,在请求数据的时候点击页面上的其他按钮会无响应,直到该fragment上的数据刷新完页面才会有反应,经过测试是由于fragment请求完数据刷新UI界面与Activity中的底部按钮都是共用的Activity UI主线程,所以只能同时响应一个,解决方案就是对列表数据进行分页处理,并用RecyclerView实现列表。

  • 分页处理就是请求完接口得到数据,作为总数据,刷新、加载时通过page再获取每页需要获取的数据,刷新页面,进行一些相关的操作即可,在此就不做赘述了。

  • 使用RecyclerView实现的好处是可以利用其局部刷新的特点,减少因为notifyDataSetChanged()带来的不必要的开销,此处用一个RecyclerView实现了GridView和ListView,用viewType属性实现两种布局的效果。

设置GridLayoutManager的列数为两列,然后通过itemViewType值判断item占用的列数。

        final GridLayoutManager manager = new GridLayoutManager(getActivity(), 2);//设置占用的列数manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) {int type = rvXiangmu.getAdapter().getItemViewType(position);Log.i("pp", position + ":" + type);//若是TYPE_ONE,占用两列,否则占用一列,分母为grid设置的列数if (type == TaskTeamEntity2.TYPE_ONE) {return manager.getSpanCount();} else {return 1;}}});rvXiangmu.setLayoutManager(manager);

给item绘制间距

        rvXiangmu.addItemDecoration(new RecyclerView.ItemDecoration() {@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {super.getItemOffsets(outRect, view, parent, state);//给布局里的子view添加边距GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams();int position = parent.getChildPosition(view);//spanSize表示item占用几列int spanSize = layoutParams.getSpanSize();//如果是GridView的话绘制//表示item占用的列数不是manager设置的总列数,表示一行多列的情况if (spanSize!=manager.getSpanCount()) {int spanIndex = layoutParams.getSpanIndex();outRect.bottom = ScreenUtil.dip2px(getActivity(), 4);if (spanIndex == 0) {outRect.left = ScreenUtil.dip2px(getActivity(), 8);outRect.right = ScreenUtil.dip2px(getActivity(), 2);} else {outRect.right = ScreenUtil.dip2px(getActivity(), 8);outRect.left = ScreenUtil.dip2px(getActivity(), 2);}if (position == 0 || position == 1) {outRect.top = ScreenUtil.dip2px(getActivity(), 4);}}}});

adapter中部分代码

    //创建新View,被LayoutManager所调用@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {//根据不同的viewType,创建并返回相应的ViewHolderswitch (viewType) {case TaskTeamEntity2.TYPE_TWO:return new TypeTwoHolder(mLayoutInflater.inflate(R.layout.item_item1, viewGroup, false));case TaskTeamEntity2.TYPE_ONE:return new TypeOneHolder(mLayoutInflater.inflate(R.layout.item_item2, viewGroup, false));}return null;}
    public class TypeOneHolder extends TypeAbstarctViewHolder {private TextView itemNameTv;private TextView itemTimeTv;public TypeOneHolder(View view) {super(view);itemNameTv = (TextView) view.findViewById(R.id.tv_item_name);itemTimeTv = (TextView) view.findViewById(R.id.tv_item_time);}@Overridepublic void bindHolder(TaskTeamEntity2 item, int position) {itemNameTv.setText(item.t_teamName);itemTimeTv.setText(item.t_enddate);}}
    //自定义的ViewHolder,持有每个Item的的所有界面元素public class TypeTwoHolder extends TypeAbstarctViewHolder {private TextView itemNameTv;private TextView itemTimeTv;public TypeTwoHolder(View view) {super(view);itemNameTv = (TextView) view.findViewById(R.id.tv_item_name);itemTimeTv = (TextView) view.findViewById(R.id.tv_item_time);}@Overridepublic void bindHolder(TaskTeamEntity2 item, int position) {itemNameTv.setText(item.t_teamName);itemTimeTv.setText(item.t_enddate);}}
    public abstract class TypeAbstarctViewHolder extends RecyclerView.ViewHolder {public TypeAbstarctViewHolder(View itemView) {super(itemView);}public abstract void bindHolder(TaskTeamEntity2 item, int position);}

优雅的使用RecyclerView(在一个recyclerView里显示有不同子布局的界面,就是混合不同布局)

一个简单的RecyclerView多布局实现

RecycleView 实现复杂首页布局三种方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么删除mysql的压缩包_压缩包版mysql怎么卸载

MySQL是一个小巧玲珑但功能强大的数据库,目前十分流行。但是官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的。那么压缩版mysql要怎么卸载?下面本篇文章就来大家介绍一下,希望对你们有所帮助。卸载压缩包版…

lambda表达式之进化

前言在C#我们可以自定义委托,但是C#为什么还要内置泛型委托呢?因为我们常常要使用委托,如果系统内置了一些你可能会用到的委托,那么就省去了定义委托,然后实例化委托的步骤,这样一来既使代码看起来简洁而干…

mysql返回行数_如何计算MySQL查询返回的行数?

How can I count the number of rows that a MySQL query returned?解决方案Getting total rows in a query result...You could just iterate the result and count them. You dont say what language or client library you are using, but the API does provide a mysql_nu…

md5不是对称密码算法_密码学中的消息摘要算法5(MD5)

md5不是对称密码算法In cryptography, MD5 (Message-Digest algorithm 5) is a mainly used cryptographic hash function with a 128-bit hash value. As we use in an Internet standard (RFC 1321), MD5 has been employed or developed in a more variety of security appl…

Windows 7 SID 修改

在安裝Windows系統時會產生一個獨一無二的SID (Security ID),它用來識別每一部主機,若在同一個區域網路內有兩部相同SID的主機,會出現警告訊息。一般而言,每次安裝時的SID不可能會發生重複,但若是使用TrueImage或Ghost…

1 并发模型

并发系统可以采用多种并发编程模型来实现。并发模型指定了系统中的线程如何通过协作来完成分配给它们的作业。不同的并发模型采用不同的方式拆分作业,同时线程间的协作和交互方式也不相同。这篇并发模型教程将会较深入地介绍目前(2015年,本文…

mysql log4jlogger_mybatis结合log4j打印SQL日志

mybatis结合log4j打印SQL日志1.Maven引用jar包默认的mybatis不能打印出SQL日志,不便于查看调试,须要结合log4jdbc-log4j2就能够完整的输入SQL的调试信息。pom.xml 配置maven。注意以下3个都须要org.bgee.log4jdbc-log4j2log4jdbc-log4j2-jdbc4.11.16org.…

cellpadding_在CSS中设置cellpadding和cellspacing

cellpaddingIntroduction: 介绍: It is not unknown anymore that now and then we make use of tables in our web page or website, therefore we all are familiar with how to create tables or grids in our website or web page but there are times when we…

mongodb 排序_技术分享 | MongoDB 一次排序超过内存限制的排查

本文目录:一、背景1. 配置参数检查2. 排序字段是否存在索引二、测试环境模拟索引对排序的影响1. 测试环境信息2. 报错语句的执行计划解释 3. 建立新的组合索引进行测试三、引申的组合索引问题1. 查询语句中,排序字段 _id 使用降序2. 查询语句中&#xff…

spark源码分析之Executor启动与任务提交篇

任务提交流程 概述 在阐明了Spark的Master的启动流程与Worker启动流程。接下继续执行的就是Worker上的Executor进程了,本文继续分析整个Executor的启动与任务提交流程Spark-submit 提交一个任务到集群通过的是Spark-submit通过启动脚本的方式启动它的主类&#xff0…

mysql 5.5.22.tar.gz_MySQL 5.5.22源码编译安装

MySQL 最新的版本都需要cmake编译安装,估计以后的版本也会采用这种方式,所以特地记录一下安装步骤及过程,以供参考。注意:此安装是默认CentOS下已经安装了最新工具包,比如GNU make, GCC, Perl, libncurses5-dev&#x…

利用python进行数据分析D2——ch03IPython

为无为,事无事,味无味。大小多少,报怨以德。图难于其易,为大于其细;天下难事必作于易,天下大事必作于细。——老子关于图片的例子:import matplotlib.pyplot as plt imgplt.imread(ch03/stinkbug.png) import pylab plt.imshow(img) pylab.show()结果:调…

mysql 视图 字典_MySQL深入01-SQL语言-数据字典-服务器变量-数据操作DML-视图

SQL语言的组成部分常见分类:DDL:数据定义语言DCL:数据控制语言,如授权DML:数据操作语言其它分类:完整性定义语言:DDL的一部分功能约束约束:包括主键,外键,唯一…

为什么我会被淘汰?

这是一个值得讨论的问题。华为前段时间也传出了大规模裁员的一些负面新闻,一时间搞的人心惶惶。总结起来说,还是怕失去这份赖以生存的工作,尤其是对于上有老下有小的中年人来说,工作尤为重要。 淘汰,是软件行业不变的真…

mysql 存储过程死循环_pl/sql存储过程loop死循环

今早,一个存储过程,写过很多次的存储过程,随手一写,各种报错,各种纠结,网上一搜,有好多个都遇到,论坛上给出的结局答案,今早,一个存储过程,写过很…

《Java学习指南》—— 1.4 设计安全

本节书摘来异步社区《Java学习指南》一书中的第1章,第1.4节,作者:【美】Patrick Niemeyer , Daniel Leuck,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.4 设计安全 Java被设计为一种安全语言,对于这一事实…

ppython_Python pcom包_程序模块 - PyPI - Python中文网

PCOM在python中一个非常基本的unitronics pcom协议实现。如何使用from pcom import commandsfrom pcom.plc import EthernetPlcwith EthernetPlc(address(192.168.5.43, 1616)) as plc:# Read realtime clockc commands.ReadRtc()res plc.send(c)print(res)# Set realtime cl…

《软件定义数据中心:Windows Server SDDC技术与实践》——导读

前言 通过对自身的审视和对身边IT 技术专家的观察,我发现对于我们来说,掌握一项新的技术或熟悉一个新的产品,大都是闻而后知,知而后学,学以致用,用以知其然。然而Windows Server作为一个简单的、易上手的操…

《Spark核心技术与高级应用》——3.2节构建Spark的开发环境

本节书摘来自华章社区《Spark核心技术与高级应用》一书中的第3章,第3.2节构建Spark的开发环境,作者于俊 向海 代其锋 马海平,更多章节内容可以访问云栖社区“华章社区”公众号查看 3.2 构建Spark的开发环境无论Windows或Linux操作系统&am…

webapi随机调用_BeetleX之webapi验证插件JWT集成

对于webapi服务应用很多时候需要制订访问限制,在前面的章节也讲述了组件如何制订控制器访问控制;但到了实际应用要自己去编写还是比较麻烦。为了让访问控制更方便组件实现基于JWT的控制器访问控制组件BeetleX.FastHttpApi.Jwt;通过这个组件可…