Adapter的notifyDataSetChanged方法会通知RecyclerView刷新全部的可见列表项。
在CriminalIntent应用里,这个方法不够高效,我们知道,返回CrimeListFragment时,最多只有一个Crime
实例会发生变化。
只需要刷新列表项中的单个crime项的话,应该使用RecyclerView.Adapter的notifyItemChanged(int)方法。修改代码调用这个方法很简单,但如何定位并刷新具体位置的列表项呢?这是个问题。

  

之前在CriminalIntent应用里面为itemView实现了点击事件。

 private class CrimeHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

         ......

         public CrimeHolder(View itemView){
super(itemView);
itemView.setOnClickListener(this);
mTitleTextView = (TextView)itemView.findViewById(R.id.list_item_crime_title_text_view);
mDateTextView = (TextView)itemView.findViewById(R.id.list_item_crime_date_text_view);
mSolvedCheckBox = (CheckBox)itemView.findViewById(R.id.list_item_crime_solved_check_box);
} @Override
public void onClick(View v){ Intent intent = CrimeActivity.newIntent(getActivity(),mCrime.getId());
startActivity(intent);
} ......
}

所以现在可以通过点击事件获取到我们点击条目的位置。

首先添加一个全局变量

int position;

然后修改onClick()中的方法

@Override
public void onClick(View v){
position = mCrimeRecyclerView.getChildAdapterPosition(v); //将获取到的位置赋值给之前定义的变量
Intent intent = CrimeActivity.newIntent(getActivity(),mCrime.getId());
startActivity(intent);
}

这里简单说下RecyclerView.getChildAdapterPosition()方法,此方法可以获取ItemView在Adapter中的位置。它接受一个view参数,将onClick()方法中的view参数传入即可。

最后修改updataUI()方法中的刷新方法

 private void updateUI(){
//单例模式获取CrimeLab 对象
CrimeLab crimeLab = CrimeLab.get(getActivity());
//获取数据
List<Crime> crimes = crimeLab.getCrimes(); if(mAdapter == null){
mAdapter = new CrimeAdapter(crimes);
mCrimeRecyclerView.setAdapter(mAdapter);
}else{
mAdapter.notifyItemChanged(position); //这里使用的是notifyItemChanged()方法。 传入的参数为position
}
}

github:https://github.com/FlashFrog/CriminalIntentChallenge.git

安卓权威编程指南 挑战练习:实现高效RecyclerView刷新的更多相关文章

  1. 安卓权威编程指南 挑战练习(第26章 在 Lollipop 设备上使用 JobService)

    26.11 挑战练习:在 Lollipop 设备上使用 JobService 请创建另一个 PollService 实现版本.新的 PollService 应该继承 JobService 并使用 Jo ...

  2. 安卓权威编程指南 挑战练习 25章 深度优化 PhotoGallery 应用

    你可能已经注意到了,提交搜索时, RecyclerView 要等好一会才能刷新显示搜索结果.请接受挑战,让搜索过程更流畅一些.用户一提交搜索,就隐藏软键盘,收起 SearchView 视图(回到只显示 ...

  3. 安卓权威编程指南 挑战练习 13.8 用于RecyclerView的空视图

    当前,CriminalIntent应用启动后,会显示一个空白列表.从用户体验上来讲,即使crime列表 是空的,也应展示提示或解释类信息. 请设置空视图展示类似“没有crime记录可以显示”的信息.再 ...

  4. 安卓权威编程指南 - 第五章学习笔记(两个Activity)

    学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 ...

  5. 安卓权威编程指南-笔记(第23章 HTTP与后台任务)

    1. 网络连接基本 //通过指定URL获取原始数据,并返回一个字节流数组. public byte[] getUrlBytes(String urlSpec)throws IOException{ / ...

  6. 安卓权威编程指南-笔记(第21章 XML drawable)

    在Andorid的世界里,凡事要在屏幕上绘制的东西都可以叫drawable,比如抽象图形,Drawable的子类,位图图形等,我们之前用来封装图片的BitmapDrawable就是一种drawable ...

  7. 安卓权威编程指南-笔记(第27章 broadcast intent)

    本章需求:首先,让应用轮询新结果并在有所发现时及时通知用户,即使用户重启设备后还没有打开过应用.其次,保证用户在使用应用时不出现新结果通知. 1. 一般intent和broadcast intent ...

  8. 安卓权威编程指南-笔记(第24章 Looper Handler 和 HandlerThread)

    AsyncTask是执行后台线程的最简单方式,但它不适用于那些重复且长时间运行的任务. 1. Looper Android中,线程拥有一个消息队列(message queue),使用消息队列的线程叫做 ...

  9. 安卓权威编程指南-笔记(第22章 深入学习intent和任务)

    本章,我们会使用隐式intent创建一个替换android默认启动器的应用.名为NerdLauncher. NerdLauncher应用能列出设备上的其他应用,点选任意列表项会启动相应应用. 1. 解 ...

随机推荐

  1. 17.3.13---join函数

    1-----Python中有join()和os.path.join()两个函数,具体作用如下:     join():    连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成 ...

  2. 第04项目:淘淘商城(SpringMvc+Spring+Mybatis) 的学习实践总结【第三天】

    淘淘商城(SpringMVC+Spring+Mybatis)  是传智播客在2015年9月份录制的,几年过去了.由于视频里课上老师敲的代码和项目笔记有些细节上存在出入,只有根据日志报错信息作出适当的调 ...

  3. selenium 2.x 为什么我录制的脚本回放时几乎必然失败呢?

    本人菜鸟一枚,最近自己在自学selenium,录制的脚本回放从未直接成功过! 我打开百度,搜索selenium,然后点击第一个结果——selenium的百度百科,但是提示打开错误! 录制的任何脚本都不 ...

  4. 分辨率单位及换算,LW / PH、LP / mm、L / mm、Cycles / mm、Cycles / pixel、LP / PH

    对于测试数字成像设备非常重要的参数是分辨率.但有不同的方式来表达数码相机的分辨率,有时令人困惑.下面介绍的是是最常见的单位. 百万像素 “这台相机有1000万像素的分辨率”是我们经常在广告上看到的数据 ...

  5. DjangoBlog部署教程

    本篇文章将会手把手教你如何部署DjangoBlog项目,首先介绍下我这里的基本环境,请大家仔细阅读此部分,下面的教程都会使用这些约定来介绍: 系统是ubuntu 18.04 LTS 假设你的域名是ww ...

  6. Prefix and Suffix

    题目描述 Snuke is interested in strings that satisfy the following conditions: The length of the string ...

  7. [LC] 61. Rotate List

    Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: I ...

  8. [LC] 203. Remove Linked List Elements

    Remove all elements from a linked list of integers that have value val. Example: Input: 1->2-> ...

  9. Factual question|具体特殊

    Factual question:答案一定出于文章,不是总结 流程:找定位词做连连看,找对定位词,先看此句,然后看选项回文对照.如果找不到找上下两句话. 为了缩小范围,定位词是具体特殊,不要抽象词,可 ...

  10. 图形学创世纪——写在SIGGRAPH 40年的边上

    40年的边上" title="图形学创世纪--写在SIGGRAPH 40年的边上"> 前言: SIGGRAPH是由ACM SIGGRAPH(美国计算机协会计算机图形 ...