Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

RecyclerView 数据刷新的几种方式 局部刷新 notify MD


目录

目录
小结
Activity
Adapter
布局
获取图片集合

小结

  • 刷新全部可见的item,notifyDataSetChanged()
  • 刷新指定item,notifyItemChanged(int)
  • 从指定位置开始刷新指定个item,notifyItemRangeChanged(int,int)
  • 插入、移动一个并自动刷新,notifyItemInserted(int)、notifyItemMoved(int)、notifyItemRemoved(int)
  • 局部刷新,notifyItemChanged(int, Object)

Activity

public class Notify_Activity extends Activity implements MyOnItemClickLitener {private RecyclerView mRecyclerView;private Notify_Adapter mAdapter;private ArrayList<PicUrls.BasicPicBean> beans;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);((SwipeRefreshLayout) findViewById(R.id.swipeLayout)).setEnabled(false);mRecyclerView = (RecyclerView) findViewById(R.id.rv);initList();initView();}protected void initView() {mAdapter = new Notify_Adapter(this, beans);mAdapter.setOnItemClickLitener(this);mRecyclerView.setAdapter(mAdapter);//设置adaptermRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));//设置布局管理器mRecyclerView.setItemAnimator(new DefaultItemAnimator());//设置Item增加、移除动画mRecyclerView.addItemDecoration(new GridItemDecoration.Builder().spanCount(3).spaceSize(1).mDivider(new ColorDrawable(0x88ff0000)).build());}private void initList() {beans = PicUrls.getPicList(PicUrls.BIG_BEANS_2);beans.get(0).name = "刷新当前,notifyItemChanged(int)";beans.get(1).name = "全部刷新,notifyDataSetChanged()";beans.get(2).name = "从此位置开始刷新2个,notifyItemRangeChanged";beans.get(3).name = "插入一个并自动刷新,notifyItemInserted";beans.get(4).name = "只更改数据源,这样当然不会刷新UI";beans.get(5).name = "插入一个并刷新当前,notifyItemChanged";beans.get(6).name = "局部刷新,tv";beans.get(7).name = "局部刷新,et";beans.get(8).name = "局部刷新,iv";}@Overridepublic void onItemClick(View view, int position) {Toast.makeText(this, position + " 被点击了", Toast.LENGTH_SHORT).show();reInit(position);}@Overridepublic void onItemLongClick(View view, int position) {Toast.makeText(this, position + "被长按了", Toast.LENGTH_SHORT).show();}private void reInit(int position) {switch (position) {default:mAdapter.notifyItemChanged(position);//刷新指定一个。一定会闪break;case 1:mAdapter.notifyDataSetChanged();//全部刷新。基本不会闪,刚开始个别可能会闪break;case 2:mAdapter.notifyItemRangeChanged(position, 2);//从指定位置开始刷新指定个。一定会闪break;case 3:beans.add(position, new PicUrls.BasicPicBean("http://img.mmjpg.com/2015/74/1.jpg", "新插入的图片1", 1));mAdapter.notifyItemInserted(position);//插入一个并刷新,正常break;case 4://只更改数据源,这样当然不会刷新UIbeans.add(position, new PicUrls.BasicPicBean("http://img.mmjpg.com/2015/74/2.jpg", "新插入的图片2", 2));break;case 5://beans.add(position, new PicUrls.BasicPicBean("http://img.mmjpg.com/2015/74/3.jpg", "新插入的图片3", 3));mAdapter.notifyItemChanged(position);//这样只会导致当前item刷新,而不会刷新其他item,当然是不行的break;case 6:beans.set(position, beans.get(new Random().nextInt(beans.size())));mAdapter.notifyItemChanged(position, Notify_Adapter.NOTIFY_TV);//局部刷新break;case 7:beans.set(position, beans.get(new Random().nextInt(beans.size())));mAdapter.notifyItemChanged(position, Notify_Adapter.NOTIFY_ET);//局部刷新break;case 8:beans.set(position, beans.get(new Random().nextInt(beans.size())));mAdapter.notifyItemChanged(position, Notify_Adapter.NOTIFY_IV);//局部刷新break;}}
}

Adapter

public class Notify_Adapter extends RecyclerView.Adapter<Notify_Adapter.MyViewHolder> {private Context context;private List<PicUrls.BasicPicBean> mDatas;private MyOnItemClickLitener mOnItemClickLitener;public static final int NOTIFY_TV = 10086;public static final int NOTIFY_ET = 10087;public static final int NOTIFY_IV = 10088;public Notify_Adapter(Context context, List<PicUrls.BasicPicBean> mDatas) {this.context = context;this.mDatas = mDatas;}@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_notify, parent, false));}@Overridepublic void onBindViewHolder(MyViewHolder holder, int position) {//不使用}@Overridepublic void onBindViewHolder(final MyViewHolder holder, int position, List payloads) {//payloads是从notifyItemChanged(int, Object)中,或从notifyItemRangeChanged(int, int, Object)中传进来的Object集合//如果payloads不为空并且viewHolder已经绑定了旧数据了,那么adapter会使用payloads参数进行布局刷新//如果payloads为空,adapter就会重新绑定数据,也就是刷新整个itemPicUrls.BasicPicBean bean = mDatas.get(holder.getAdapterPosition());long time = System.currentTimeMillis() + bean.url.hashCode();String data = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(new Date(time));if (payloads.isEmpty()) {//为空,即不是调用notifyItemChanged(position,payloads)后执行的,也即在初始化时执行的holder.tv.setText(data);holder.et.setText(bean.name);Glide.with(context).load(bean.url).dontAnimate()//.diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true).into(holder.iv);} else if (payloads.size() > 0 && payloads.get(0) instanceof Integer) {//不为空,即调用notifyItemChanged(position,payloads)后执行的,可以在这里获取payloads中的数据进行局部刷新int type = (int) payloads.get(0);// 刷新哪个部分 标志位switch (type) {case NOTIFY_TV:holder.tv.setText(data);//只刷新tvbreak;case NOTIFY_ET:holder.et.setText(bean.name);//只刷新etbreak;case NOTIFY_IV:Glide.with(context).load(bean.url).dontAnimate().into(holder.iv);//只刷新ivbreak;}}// 如果设置了回调,则设置点击事件holder.itemView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (mOnItemClickLitener != null) mOnItemClickLitener.onItemClick(holder.itemView, holder.getAdapterPosition());}});holder.itemView.setOnLongClickListener(new OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {if (mOnItemClickLitener != null) mOnItemClickLitener.onItemLongClick(holder.itemView, holder.getAdapterPosition());return false;}});}@Overridepublic int getItemCount() {return mDatas.size();}/*** 添加并更新数据,同时具有动画效果*/public void addDataAt(int position, PicUrls.BasicPicBean data) {mDatas.add(position, data);notifyItemInserted(position);//更新数据集,注意如果用adapter.notifyDataSetChanged()将没有动画效果}/*** 移除并更新数据,同时具有动画效果*/public void removeDataAt(int position) {mDatas.remove(position);notifyItemRemoved(position);}public void setOnItemClickLitener(MyOnItemClickLitener mOnItemClickLitener) {this.mOnItemClickLitener = mOnItemClickLitener;}class MyViewHolder extends RecyclerView.ViewHolder {TextView tv;ImageView iv;EditText et;public MyViewHolder(View view) {super(view);tv = (TextView) view.findViewById(R.id.tv_name);iv = (ImageView) view.findViewById(R.id.iv_head);et = (EditText) view.findViewById(R.id.et_input);}}
}

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center_horizontal"android:orientation="vertical"><TextViewandroid:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:text="0.00"android:textColor="#00f"android:textSize="13sp"/><ImageViewandroid:id="@+id/iv_head"android:layout_width="match_parent"android:layout_height="200dp"android:scaleType="centerCrop"android:src="@mipmap/ic_launcher"/><EditTextandroid:id="@+id/et_input"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:hint="包青天"android:inputType="numberDecimal"android:labelFor="@id/et_input"android:maxLines="1"android:minWidth="50dp"android:textColor="#f00"android:textSize="10sp"/>
</LinearLayout>

获取图片集合

public class PicUrls {private static final String HOST0 = "http://img1.mm131.com/pic/";//网站【http://www.mm131.com/】private static final String HOST1 = "http://img.mmjpg.com/";//网站【http://www.mmjpg.com/】private static final String HOST2 = "http://pic.meituba.com/uploads/allimg/";//网站【http://www.meituba.com/】public static final UrlBean BIG_BEANS_0 = new UrlBean.Builder()//http://pic.meituba.com/uploads/allimg/2015/10/23/220.jpg.host(HOST2).urlHeader("2015/10/23/").picIndexFrom(220).picCount(100).picDes("100张动漫卡通壁纸").build();public static final UrlBean BIG_BEANS_1 = new UrlBean.Builder()//http://pic.meituba.com/uploads/allimg/2017/03/27/121_5600.jpg.host(HOST2).urlHeader("2017/03/27/121_").picIndexFrom(5600).picCount(100).picDes("100张搞笑内涵图片").build();public static final UrlBean BIG_BEANS_2 = new UrlBean.Builder()//http://pic.meituba.com/uploads/allimg/2015/10/23/360.jpg.host(HOST2).urlHeader("2015/10/23/").picIndexFrom(360).picCount(750).picDes("750张性感美女图").build();public static final UrlBean BIG_BEANS_3 = new UrlBean.Builder()//http://pic.meituba.com/uploads/allimg/2016/03/25/43_20335.jpg.host(HOST2).urlHeader("2016/03/25/43_").picIndexFrom(20335).picCount(1400).picDes("1400张动漫卡通壁纸").build();private static final UrlBean[] simpleBeans = {//http://img1.mm131.com/pic/996/1.jpgnew UrlBean.Builder().host(HOST0).urlHeader("996/").picCount(10).picDes("北影校花余雨高清写真图片").build(),new UrlBean.Builder().host(HOST0).urlHeader("2958/").picCount(10).picDes("童颜嫩妹桃子黑丝大尺度诱惑").build(),new UrlBean.Builder().host(HOST0).urlHeader("2939/").picCount(10).picDes("清纯少女刘奕宁酥胸覆白色内衣").build(),new UrlBean.Builder().host(HOST0).urlHeader("2343/").picCount(10).picDes("萌妹销魂写真身材惹火让人欲罢不能").build(),new UrlBean.Builder().host(HOST0).urlHeader("2935/").picCount(10).picDes("性感女神杨晨晨透视睡衣大胆秀乳").build(),//http://img.mmjpg.com/2015/444/1.jpgnew UrlBean.Builder().host(HOST1).urlHeader("2015/444/").picCount(10).picDes("模范学院美少女柳侑绮制服大片").build(),new UrlBean.Builder().host(HOST1).urlHeader("2015/74/").picCount(10).picDes("极品女神可儿私拍秀完美身材").build(),new UrlBean.Builder().host(HOST1).urlHeader("2017/990/").picCount(10).picDes("香艳妹子雪白的美胸绝对让你大饱眼福").build(),new UrlBean.Builder().host(HOST1).urlHeader("2017/962/").picCount(10).picDes("真诱人啊!女神雪白的美胸看着很有感觉").build(),new UrlBean.Builder().host(HOST1).urlHeader("2017/936/").picCount(10).picDes("身材娇美纯天然美女小叶子美胸艺术照").build(),//http://pic.meituba.com/uploads/allimg/2015/10/23/247.jpgnew UrlBean.Builder().host(HOST2).urlHeader("2015/10/23/").picIndexFrom(247).picCount(10).picDes("呆萌可爱的哆啦A梦动漫").build(),new UrlBean.Builder().host(HOST2).urlHeader("2016/03/25/43_").picIndexFrom(20574).picCount(10).picDes("海贼王红发香克斯").build(),

2017-6-7

RecyclerView 数据刷新的几种方式 局部刷新 notify MD相关推荐

  1. (转)基于MVC4+EasyUI的Web开发框架经验总结(12)--利用Jquery处理数据交互的几种方式...

    http://www.cnblogs.com/wuhuacong/p/4085682.html 在基于MVC4+EasyUI的Web开发框架里面,大量采用了Jquery的方法,对数据进行请求或者提交, ...

  2. Servlet向JSP传递数据以及JSP页面DIV定时局部刷新

    系列文章: ESP8266的AP模式与STA模式简单测试 简单的Java服务器和客户端的通信 STM32 ESP8266和Java服务器透传模式下的双向通信 jsp向servlet传输数据 Servl ...

  3. Vue页面刷新的三种方式

    vue页面刷新的三种方式 由于功能需求,需要离开页面前告知用户是否需要丢弃未保存的数据,这时候切换的菜单会失效,但是菜单依然会高亮错误.所以要进行一次页面刷新. 方法一 原地页面刷新 this.$ro ...

  4. docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别

    前言 这篇博文是我对docker实现数据持久化几种方式的特征进行一个总结. 在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2(将此 ...

  5. linux数据同步技术比较,linux下实现web数据同步的四种方式(性能比较)教程.docx

    linux下实现web数据同步的四种方式(性能比较)教程 实现web数据同步的四种方式=======================================1.nfs实现web数据共享2.rs ...

  6. Hive数据导出的几种方式

    Hive数据导出的几种方式 参考资料地址:http://blog.csdn.net/qianshangding0708/article/details/50394789 感谢分享 (1)导出到本地文件 ...

  7. linux下实现web数据同步的四种方式(性能比较)

    实现web数据同步的四种方式 ======================================= 1.nfs实现web数据共享 2.rsync +inotify实现web数据同步 3.rs ...

  8. 数据迁移的几种方式 - MySQL数据库

    写在前面:博主是一只经过实战开发历练后投身培训事业的"小山猪",昵称取自动画片<狮子王>中的"彭彭",总是以乐观.积极的心态对待周边的事物.本人的技 ...

  9. 实现web数据同步的四种方式

    实现web数据同步的四种方式 ======================================= 1.nfs实现web数据共享 2.rsync +inotify实现web数据同步 3.rs ...

  10. Android页面数据传递的两种方式

    在android中实现页面中数据的传递有两种方式: 1:第一种数据传递的方式是通过inputExtra方法来进行数据的传递的 2:第二中方法是通过bundle的方法来实现数据的传递的 接下来我们首先来 ...

最新文章

  1. 北理计算机考研机试,北理工计算机2000-2010考研机试题目c语言实现.doc
  2. 10.Ubuntu下的source insight增加使用期限90天
  3. 企业网络推广网站排名首页但确保用户体验也是企业网络推广的关键
  4. 【人物】徐小平:远离创业的3个死亡陷阱
  5. (四)DOM对象和jQuery对象
  6. 当今 计算机已进入千家万户英语,学生英语教学论文,关于信息技术在大学英语教学中的应用探析相关参考文献资料-免费论文范文...
  7. 作者:高翔(1984-),男,国防大学信息作战与指挥训练教研部博士后,主要研究方向为体系分析与超网建模。...
  8. [HTTP] HTTP消息
  9. 分布式数据库拆分常用之法
  10. linux frame buffer 显示图片 没有颜色,新路程----linux framebuffer显示图片c程序
  11. hover 插入html元素,解决hover生成border造成的元素移动方法
  12. 什么是RS-232-C接口与什么是RS-485接口?
  13. Java学习(8) —— 异常处理
  14. [Python]_[初级]_[使用PyCharm时不识别根包位置和Debug时报ModuleNotFoundError错误]
  15. Qt 主窗口不能最大化
  16. Material Design控件使用(一)
  17. 自动驾驶(十一)---------泰勒展开式、雅克比矩阵、主成分分析
  18. 乐观锁和悲观锁的简单实现
  19. css 横线中间添加文字
  20. 苹果新品发布会汇总:iphone13系列、ipad mini6,全新外观配色,加量减价

热门文章

  1. halcon 深度学习标注_Halcon18--深度学习应用问题记录
  2. 【写博客常用】美赛成绩如何快速查询!
  3. MySQL索引性能测试
  4. 注册测绘师考试复习视频资料
  5. stm32用tft-lcd 显示自定义大小的字体
  6. Pandas基础学习
  7. Android 学习之路
  8. 零起点学习Linux系列培训视频-寒冰作品
  9. 庖丁解D,游刃有余---Discuz!免费版安全性分析(转)
  10. 防止屏蔽,背投广告代码的完善