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. [GX/GZOI2019]与或和(单调栈+按位运算)

    首先看到与或,很显然想到按照位拆分运算.然后就变成了0/1矩阵,要使矩阵在当前位与为1,则矩阵全为1,如果是或为1,则是矩阵不全为0,然后求全为0/1的矩阵个数即可.记录c[i][j]表示以a[i][ ...

  2. Spring Boot使用Liquibase最佳实践

    Liquibase问题 随着项目的发展,一个项目中的代码量会非常庞大,同时数据库表也会错综复杂.如果一个项目使用了Liquibase对数据库结构进行管理,越来越多的问题会浮现出来. ChangeSet ...

  3. MySQL允许某个IP网段从远程访问的方法

    grant select,insert,update,create on test.* to test@'192.168.8.%' identified by '123456';     允许增删改查 ...

  4. poj-3658 Artificial Lake(模拟)

    http://poj.org/problem?id=3658 Description The oppressively hot summer days have raised the cows' cl ...

  5. 9.数据分组 group by

    --数据分组 group by --作用:用于 对查询的数据进行分组,并处理 select deptno,job from emp group by deptno,job --1.分组之后,不能将除分 ...

  6. top和margin-top的区别

    1.top等为绝对定位,需与position:absolute一起用才有效:而margin-top为相对定位: 2.绝对定位一般情况下以body为标准:若父元素设置position:relative, ...

  7. Linux下重要文件

    1:/etc/sysconfig/network-scripts/ifcfg-ens130 2:   /etc/resolv.conf   DNS配置文件 3:/etc/hosts 4:/etc/sy ...

  8. list split批量处理

    <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-colle ...

  9. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-openpyxl读取excel(14)

    从excel中读取数据 # -*- coding: utf-8 -*- # @Time : 2020/2/12 17:23 # @File : do_excel_openpyxl_14.py # @A ...

  10. freeRadius日志关闭

    vim /etc/raddb/radiusd.conf #file = ${logdir}/radius.log file = /dev/null vim /etc/raddb/modules/det ...