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要怎么卸载?下面本篇文章就来大家介绍一下,希望对你们有所帮助。卸载压缩包版…

obj.val 非数组_在Ruby中使用Array.new(size,obj)创建数组

obj.val 非数组In the previous article, we have learnt how we can declare an Array class instance with the help of Array.[](*args) method? You can also notice that in the program codes written to demonstrate all those methods are having Array instances dec…

julia在mac环境变量_在Julia中找到值/变量的类型

julia在mac环境变量To find the type of a variable/value, we use the typeof() function – it accepts a parameter whose type to be found and returns its data type. 为了找到变量/值的类型,我们使用typeof()函数-它接受要查找其类型的参数并返回其数据类型。…

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…

discuz mysql 类_discuz7 phpMysql操作类

MySql数据库连接类,大家可以看下网上老手们用的什么方法,大家可以直接拿来用,但前提是大家能熟练的掌握的基础上,这样才能有所进步。/** MySql数据库连接类* mysql.class.php 2009.04.15 by Hackbaby*/class dbstuff {var $versio…

1 并发模型

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

Java String compareTo()方法与示例

字符串compareTo()方法 (String compareTo() Method) compareTo() is a String method in Java and it is used to compare two strings (case-sensitive). compareTo()是Java中的String方法,用于比较两个字符串(区分大小写)。 If both strings are equal – it r…

nginx mysql 查询系统_nginx/mysql查看内存占用

查看每个php-fpm平均占用系统内存,也适用看nginx/mysqld等,把php-fpm换成mysqldps --no-headers -o "rss,cmd" -C php-fpm | awk { sum$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }查看占用内存[rootcentos69 ~]# ps -ylC php-fpm --sort:r…

linux用户及权限详解(20170425)

计算机资源权限用户用户,容器,关联权限:用户组,方便的指派权限用户:标示符用户组:标示符r 、w、x:1、2、4对于文件r:可读,可以使用类似cat等命令查看文件内容w:可写&…

kotlin 判断数字_Kotlin程序检查数字是否为质数

kotlin 判断数字A prime number is a natural number that is greater than 1 and cannot be formed by multiplying two smaller natural numbers. 质数是大于1的自然数,不能通过将两个较小的自然数相乘而形成。 Given a number num, we have to check whether nu…

mysql gtid配置_mysql 5.7 GTID主从配置

binlog-format:二进制日志的格式,有row、statement和mixed几种类型;需要注意的是:当设置隔离级别为READ-COMMITED必须设置二进制日志格式为ROW,现在MySQL官方认为STATEMENT这个已经不再适合继续使用;但mixe…

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.…

限制对web路径的访问

$ipcmd -I INPUT -i eth0 -p tcp --dport 80 -m string --string "/adapi" --algo bm -j DROP$ipcmd -I INPUT -i eth0 -p tcp --dport 80 -m string --string "/epapi" --algo bm -j DROP转载于:https://blog.51cto.com/luoguoling/1919928

kotlin 查找id_Kotlin程序查找等边三角形的区域

kotlin 查找idFormula to find area of Equilateral Triangle: area ( 1.73 side side)/4 查找等边三角形面积的公式: 面积(1.73边边)/ 4 Given the value of side, we have to find the area of Equilateral Triangle. 给定边的值,我们必须找到等边…

Orcale11g单机安装与卸载

前言:本篇主要介绍Oracle11g企业版安装的准备工作,建议使用图形化界面安装,静默安装出现问题较多,初学者不好排查,本篇只给出关键步骤,最后介绍完全删除Orcale方法; Oracle Database 11g Expres…

qt连接mysql4.7数据库_QT4.7访问MySQL的驱动编译过程

我们假设你已经成功安装了MySQL(我用的是MySQL的安装版)和QT,MySQL的安装路径采用的是其默认安装路径,也就是安装在了C:\Program Files下。下面开始正式讲解QT访问安装版MySQL的驱动的编译方法。第一步:因为MySQL的安装路径下有空格&#xff…

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…