使用RecyclerView时怎么通过ViewHolder,在改变的时代改变自己某一个item的外观

RecyclerView加载不同item并实现其item点击事件,实现添加常用应用的功能
先上效果图吧
勾选需要的应用点击添加
这里出现了三种item的样式,一种是加号,一种是应用图标加文字,最后一种是应用图标加文字还有个checkBox
这里RecyclerView是配合CardView使用的。
在AS中使用RecyclerView需要先在build.gradle中添加依赖
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:recyclerview-v7:23.4.0'
compile 'com.android.support:cardview-v7:23.4.0'
布局文件:
三种item的布局:
card_plus.xml 加号的布局
card_no_check.xml 没有checkBox的item布局
card_check.xml 有checkBox的item布局
重点就在Adapter里面了,RecyclerView继承的是RecyclerView.Adapter&&
因为这里主要是要加载三种不同的item
所以要重写getItemViewType(int position)方法,以决定元素的布局使用哪种类型。由于有三种item,所以也要写三个ViewHolder,继承RecyclerView.ViewHolder.另外还要重写的方法有onCreateViewHolder()用于渲染具体的ViewHolder,onBindViewHolder用于绑定ViewHolder的数据。
RecyclerViewAdapter.java
public class RecyclerViewAdapter extends RecyclerView.Adapter implements View.OnClickListener {
private List mL
private PackagePreference mP
private OnRecyclerViewItemClickListener mL
private static int mF
public final static int NO_CHECK = 0;
public final static int CHECK = 1;
public final static int PLUS = 2;
public RecyclerViewAdapter(List list, int flag) {
this.mList =
this.mFlag =
mPreference = PackagePreference.getInstance(MyApplication.getContext());
* 渲染具体的ViewHolder
* @param parent
ViewHolder的容器
* @param viewType 根据该标志实现渲染不同类型的ViewHolder
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//加载数据item的布局,生成VH返回
if (viewType == NO_CHECK) {
return new NoCheckViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.card_no_check, parent, false));
} else if (viewType == CHECK) {
return new CheckViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.card_check, parent, false));
} else if (viewType == PLUS) {
return new PlusViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.card_plus, parent, false));
* 绑定ViewHolder的数据
* @param holder
* @param position
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
PackageMessage message = mList.get(position);
//数据绑定
if (holder instanceof NoCheckViewHolder) {
bindNoCheckViewHolder(message, (NoCheckViewHolder) holder);
} else if (holder instanceof CheckViewHolder) {
bindCheckViewHolder(message, (CheckViewHolder) holder);
holder.itemView.setTag(position);
holder.itemView.setOnClickListener(this);
public int getItemCount() {
if (null == mList) {
return mList.size();
* 决定元素的布局使用哪种类型
* @param position
* @return 传递给onCreateViewHolder的第二个参数
public int getItemViewType(int position) {
if (mFlag == NO_CHECK) {
if (position == mList.size() - 1) {
return PLUS;
return NO_CHECK;
} else if (mFlag == CHECK) {
return CHECK;
return 100;
private void bindNoCheckViewHolder(PackageMessage message, NoCheckViewHolder holder) {
holder.tv.setText(message.getLabel());
holder.img.setImageDrawable(message.getIcon());
private void bindCheckViewHolder(PackageMessage message, final CheckViewHolder holder) {
holder.tv2.setText(message.getLabel());
holder.img2.setImageDrawable(message.getIcon());
final String packageName = message.getPackageName();
holder.checkBox2.setChecked(mPreference.getPackageMessage(packageName));
holder.checkBox2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (holder.checkBox2.isChecked()) {
mPreference.putPackageMessage(packageName, true);
mPreference.putPackageMessage(packageName, false);
public static class NoCheckViewHolder extends RecyclerView.ViewHolder {
public ImageV
public TextV
public NoCheckViewHolder(View itemView) {
super(itemView);
img = (ImageView) itemView.findViewById(R.id.img_card);
tv = (TextView) itemView.findViewById(R.id.tv_card);
public static class CheckViewHolder extends RecyclerView.ViewHolder {
public CheckBox checkBox2;
public ImageView img2;
public TextView tv2;
public CheckViewHolder(View itemView) {
super(itemView);
checkBox2 = (CheckBox) itemView.findViewById(R.id.checkbox_card2);
img2 = (ImageView) itemView.findViewById(R.id.img_card2);
tv2 = (TextView) itemView.findViewById(R.id.tv_card2);
public static class PlusViewHolder extends RecyclerView.ViewHolder {
public ImageView img_plus_
public PlusViewHolder(View itemView) {
super(itemView);
img_plus_card = (ImageView) itemView.findViewById(R.id.img_plus_card);
public void onClick(View v) {
if (null != mListener) {
mListener.onItemClick(v, (Integer) v.getTag());
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
this.mListener =
public interface OnRecyclerViewItemClickListener {
void onItemClick(View view, int position);
由于RecyclerView没有item的点击事件,所以此处在Adapter里面添加item的点击事件,定义一个接口OnRecyclerViewItemClickListener,写一个抽象方法onItemClick(View view,int position)把当前item的position设置进去,在onBindView里面监听item的点击事件。
Activity或Fragment调用处:
我这里是使用的网格布局,所以实例化网格布局管理器GridLayoutManager,如果是线性布局,则实例化LinearLayoutManager
在实例化RecyclerViewAdapter的时候,将item的类型传过去
//线性布局管理器
LinearLayoutManager llManager = new LinearLayoutManager(mContext);
GridLayoutManager glManager = new GridLayoutManager(mContext, 4);
//设置布局管理器
mRecyclerView.setLayoutManager(glManager);
mRecyclerView.setHasFixedSize(true);
//每个选项高度固定
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mAdapter = new RecyclerViewAdapter(mCheckedList, RecyclerViewAdapter.NO_CHECK);
mAdapter.setOnItemClickListener(this);
mRecyclerView.setAdapter(mAdapter);
实现RecyclerViewAdapter.OnRecyclerViewItemClickListener,点击最后一个item(加号)的时候跳转到另一个Activity
public void onItemClick(View view, int position) {
if (position == (mCheckedList.size() - 1)) {
startActivityForResult(new Intent(getActivity(), ListActivity2.class), 1);
到这里用RecyclerView显示不同的item还有点击事件也就完成了。
下面说下这个demo的数据存储等
先获取安装了的应用信息
在Application里
MyApplication.java
public class MyApplication extends Application {
private static Context mC
private PackageManager mPackageM
private List mPackageInfoL
private ApplicationInfo mApplicationI
private static List mPackL
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
mPackageManager = getPackageManager();
mPackageInfoList = mPackageManager.getInstalledPackages(0);
getPackageMessage();
public static Context getContext() {
* 得到应用的包名并存储
private void getPackageMessage() {
List systemApps = new ArrayList&&();
for (PackageInfo apps : mPackageInfoList) {
if ((apps.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) & 0) {
//获取系统应用
systemApps.add(apps);
int size = systemApps.size();
mPackList = new ArrayList&&();
for (int i = 0; i & i++) {
message = new PackageMessage();
PackageInfo packageInfo = systemApps.get(i);
mApplicationInfo = packageInfo.applicationI
String packageName = mApplicationInfo.packageN
Drawable drawable = mPackageManager.getApplicationIcon(mApplicationInfo);
String label = (String) mPackageManager.getApplicationLabel(mApplicationInfo);
message.setIcon(drawable);
message.setLabel(label);
message.setPackageName(packageName);
mPackList.add(message);
public static List getmPackList() {
return mPackL
PackageMessage是一个存放应用信息的实体类
public class PackageMessage {
private String packageN
private boolean isC
//是否选中
public String getPackageName() {
return packageN
public void setPackageName(String packageName) {
this.packageName = packageN
public Drawable getIcon() {
public void setIcon(Drawable icon) {
this.icon =
public String getLabel() {
public void setLabel(String label) {
this.label =
public boolean isChecked() {
return isC
public void setIsChecked(boolean isChecked) {
this.isChecked = isC
最先出现的RecyclerVIew的Fragment
Fragment2.java
public class Fragment2 extends Fragment implements RecyclerViewAdapter.OnRecyclerViewItemClickListener {
private View mV
private RecyclerView mRecyclerV
private List mPackL
//全部的应用的信息列表
private List mCheckedL
//已经被选中的应用列表
private RecyclerViewAdapter mA
private Context mC
private PackagePreference mP
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment2, container, false);
mRecyclerView = (RecyclerView) mView.findViewById(R.id.recycleView);
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//线性布局管理器
LinearLayoutManager llManager = new LinearLayoutManager(mContext);
GridLayoutManager glManager = new GridLayoutManager(mContext, 4);
//设置布局管理器
mRecyclerView.setLayoutManager(glManager);
mRecyclerView.setHasFixedSize(true);
//每个选项高度固定
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mContext = MyApplication.getContext();
mPreference = PackagePreference.getInstance(mContext);
mPackList = MyApplication.getmPackList();
showCheckedList();
public void onItemClick(View view, int position) {
if (position == (mCheckedList.size() - 1)) {
startActivityForResult(new Intent(getActivity(), ListActivity2.class), 1);
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == 2) {
showCheckedList();
private void showCheckedList() {
mCheckedList = new ArrayList&&();
String[] names = mPreference.getAllCheckedPackageNames();
for (int i = 0; i & names. i++) {
for (int j = 0; j & mPackList.size(); j++) {
if (names[i].equals(mPackList.get(j).getPackageName())) {
mCheckedList.add(mPackList.get(j));
PackageMessage m = new PackageMessage();
mCheckedList.add(m);
mAdapter = new RecyclerViewAdapter(mCheckedList, RecyclerViewAdapter.NO_CHECK);
mAdapter.setOnItemClickListener(this);
mRecyclerView.setAdapter(mAdapter);
这里采用SharedPreference来存储系统中安装的应用包名,key为包名,value为是否选中。另定义了一个字符串来存储已经选中的应用的包名。
PackagePreference.java
public class PackagePreference {
private String PREFS_CHECKED_NAME = &CheckedPackageName&;
private Context mC
private static PackagePreference mPackageP
private SharedPreferences mSp;
private SharedPreferences.Editor mE
private String TAG = &PackagePreference&;
private StringBuilder mCheckedPackageN
private PackagePreference(Context context) {
this.mContext =
mSp = context.getSharedPreferences(&checkedPackage&, Context.MODE_PRIVATE);
mEditor = mSp.edit();
public static PackagePreference getInstance(Context context) {
if (mPackagePreference == null) {
mPackagePreference = new PackagePreference(context);
return mPackageP
* 将应用的包名和是否被选中放进去
public void putPackageMessage(String packageName, boolean isChecked) {
mEditor.putBoolean(packageName, isChecked).commit();
String name = getCheckedPackageName();
mCheckedPackageName = new StringBuilder(name);
if (isChecked) {
mCheckedPackageName.append(packageName).append(&,&);
int index = mCheckedPackageName.indexOf(packageName);
mCheckedPackageName.delete(index, index + packageName.length() + 1);
putCheckedPackageName();
public void putCheckedPackageName() {
mEditor.putString(PREFS_CHECKED_NAME, mCheckedPackageName.toString()).commit();
public String getCheckedPackageName() {
return mSp.getString(PREFS_CHECKED_NAME, &&);
* 通过包名得知是否被选中
* @param packageName
public boolean getPackageMessage(String packageName) {
return mSp.getBoolean(packageName, false);
* 得到所有选中的应用名数组
public String[] getAllCheckedPackageNames() {
String name = getCheckedPackageName();
String[] names = name.split(&,&);
至于ListActivity2,就只是将所有应用的图标和名称显示出来。RecyclerView加载不同view实现效果
运行效果:
如果你想在菜单打开或者关闭的时候做些事情,还可以设置listene5710人阅读
开发备忘(15)
项目中需要横向滚动效果,按照以前的思路,我会写一个ScrollView,里边加一个LinearLayout,在代码中动态加入控件,然后动态删除或者改变颜色,现在android有了新控件RecyclerView,可以方便的实现这样的功能,具体使用方法请参考这篇文章:
主要问题在于,我点击一个item,改变颜色,点击其他项,改变颜色,上一次点击的变回原来的颜色,刚开始实现的方法是在控件上直接修改,发现滑动的时候,颜色会乱掉,所以在adapter里边加入一个list进行标记,根据标记改变控件颜色
相应的adapter
public class AddDeviceAdapter extends RecyclerView.Adapter&AddDeviceAdapter.ViewHolder& /*implements View.OnClickListener*/{
private OnItemClickListener mOnItemClickListener = null;
private LayoutInflater mI
private List&AddDevice& mD
private AddDevice addD
private List&Boolean& isC
public AddDeviceAdapter(Context context, List&AddDevice& datas) {
mInflater = LayoutInflater.from(context);
isClicks = new ArrayList&&();
for(int i = 0;i&mDatas.size();i++){
isClicks.add(false);
public void setDatas(List&AddDevice& datas) {
L.e("AddDeviceAdapter's mDatas===" + new Gson().toJson(mDatas));
public void setOnItemClickLitener(OnItemClickListener mOnItemClickListener) {
this.mOnItemClickListener = mOnItemClickL
public int getItemCount() {
return mDatas.size();
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = mInflater.inflate(R.layout.item_add_device, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(view);
viewHolder.viewSpace = view.findViewById(R.id.viewSpace);
viewHolder.ivAddDevice = (ImageView) view.findViewById(R.id.ivAddDevice);
viewHolder.tvAddDevice = (TextView) view.findViewById(R.id.tvAddDevice);
return viewH
public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
addDevice = mDatas.get(i);
viewHolder.ivAddDevice.setImageResource(addDevice.getResId());
viewHolder.tvAddDevice.setText(addDevice.getItemText());
viewHolder.itemView.setTag(viewHolder.tvAddDevice);
if(isClicks.get(i)){
viewHolder.tvAddDevice.setTextColor(Color.parseColor("#00a0e9"));
viewHolder.tvAddDevice.setTextColor(Color.parseColor("#ffffff"));
if (mOnItemClickListener != null) {
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
for(int i = 0; i &isClicks.size();i++){
isClicks.set(i,false);
isClicks.set(i,true);
notifyDataSetChanged();
mOnItemClickListener.onItemClick(viewHolder.itemView,viewHolder.tvAddDevice, i);
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View arg0) {
super(arg0);
View viewS
ImageView ivAddD
TextView tvAddD
public interface OnItemClickListener {
void onItemClick(View view, TextView textView,int position);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:99993次
积分:1793
积分:1793
排名:千里之外
原创:85篇
评论:31条
(1)(1)(1)(7)(1)(3)(5)(2)(5)(3)(6)(1)(5)(1)(14)(9)(9)(11)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'原创文章,转载请注明 ( 来自: 李济洲的博客 )
如果你还不了解RecyclerView如何去使用,可以参考我的前面几篇博文,再看此篇博文:)
以前在使用ListView当中,如果我们的列表数据发生了改变,我们会去调用Adapter.notifyDataSetChanged()去更新UI界面上的列表数据,当然这个方法在RecyclerView也同样适用,那么既然说RecyclerView是ListView最好的替代者,那么RecyclerView有没有什么高级的方法呢?答案是有的。RecyclerView的Adapter支持更多种类的更新UI数据的方法,并且RecyclerView为添加删除移动都做了默认的动画效果。
看一下RecyclerView的Adapter主要增加了哪些方法:
notifyItemChanged(int position) 更新列表position位置上的数据可以调用
notifyItemInserted(int position) 列表position位置添加一条数据时可以调用,伴有动画效果
notifyItemRemoved(int position) 列表position位置移除一条数据时调用,伴有动画效果
notifyItemMoved(int fromPosition, int toPosition) 列表fromPosition位置的数据移到toPosition位置时调用,伴有动画效果
notifyItemRangeChanged(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项进行数据刷新
notifyItemRangeInserted(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项批量添加数据时调用,伴有动画效果
notifyItemRangeRemoved(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项批量删除数据时调用,伴有动画效果
看下本篇博文要实现的DEMO效果
可以看到RecyclerView的增删移动操作都自动带有了动画效果,这点靠Adapter.notifyDataSetChanged更新UI数据是做不到的,需要靠RecyclerView的Adapter新增的方法去实现。
下面详细的介绍下实现过程
配置Recyclerview,build.gradle
compile 'com.android.support:recyclerview-v7:23.1.1'
首先是主界面的布局,很简单上面一个Toolbar下面是RecyclerView,res/layout/activity_main.xml
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.leejz.recyclerviewanim.MainActivity"&
android:id="@+id/toolbar"
android:background="@color/colorPrimary"
android:layout_height="?attr/actionBarSize"
android:layout_width="match_parent" &
xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rv_list"
RecyclerView列表项布局 ,res/layout/item_layout.xml
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="8dp"
android:background="@color/colorAccent"
android:id="@+id/tv_text"
android:padding="20dp"
android:textColor="#ffffff"
android:layout_width="match_parent"
android:layout_height="wrap_content"/&
然后是Toolbar需要用到的菜单XML,分别对应的是demo效果图toolbar上面4个选项,res/menu/menu_main.xml
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="/apk/res/android"
xmlns:app="/apk/res-auto"
xmlns:tools="/tools"
tools:context=".MainActivity"&
android:id="@+id/menu_add"
android:title="Add"
android:orderInCategory="80"
app:showAsAction="always" /&
android:id="@+id/menu_del"
android:title="Del"
android:orderInCategory="80"
app:showAsAction="always" /&
android:id="@+id/menu_addmore"
android:title="AddMore"
android:orderInCategory="80"
app:showAsAction="always" /&
android:id="@+id/menu_move"
android:title="Move"
android:orderInCategory="80"
app:showAsAction="always" /&
然后去建立RecyclerView的Adapter,很常规的一个Adapter如果看不懂,证明你还不会使用RecyclerView建议点击文章开头的几个链接去学习一下:)
RecyclerViewAdapter.java
public class RecyclerViewAdapter extends RecyclerView.Adapter&RecyclerViewAdapter.MyViewHolder& {
private LayoutInflater mLayoutI
private Context mC
private ArrayList&String& mTitle=new ArrayList&&();
public RecyclerViewAdapter(Context context,ArrayList&String&title){
mLayoutInflater=LayoutInflater.from(context);
static class MyViewHolder extends RecyclerView.ViewHolder{
TextView mTextV
public MyViewHolder(View itemView) {
super(itemView);
mTextView=(TextView)itemView.findViewById(R.id.tv_text);
public void remove(int position) {
mTitle.remove(position);
notifyItemRemoved(position);
public void add(String text, int position) {
mTitle.add(position, text);
notifyItemInserted(position);
public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MyViewHolder(mLayoutInflater.inflate(R.layout.item_layout,parent,false));
public void onBindViewHolder(RecyclerViewAdapter.MyViewHolder holder, int position) {
holder.mTextView.setText(mTitle.get(position));
public int getItemCount() {
return mTitle==null ? 0 : mTitle.size();
最后是重要的MainActivity类,其中涉及到了对Toolbar的使用,不熟悉的朋友也可以顺便复习下,Toolbar上面4个菜单分别对应了新增列表,删除列表,新增批量列表,列表项移动的操作,具体可以参考下面代码注释,MainActivity.java
* Created by LeeJizhou on .
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerV
private String[] title = {"JAVA","C","C++","C#","PYTHON","PHP"
,".NET","JAVASCRIPT","RUBY","PERL","VB","OC","SWIFT"
private ArrayList&String& mTitle=new ArrayList&&();
private RecyclerViewAdapter mRecyclerViewA
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
toolbar.setOnMenuItemClickListener(onMenuItemClick);
mRecyclerView = (RecyclerView) findViewById(R.id.rv_list);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);
Collections.addAll(mTitle,title);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mRecyclerView.setAdapter(mRecyclerViewAdapter=new RecyclerViewAdapter(this, mTitle));
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
private Toolbar.OnMenuItemClickListener onMenuItemClick = new Toolbar.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.menu_add:
mTitle.add(0, "");
mRecyclerViewAdapter.notifyItemInserted(0);
mRecyclerView.scrollToPosition(0);
case R.id.menu_del:
mTitle.remove(0);
mRecyclerViewAdapter.notifyItemRemoved(0);
case R.id.menu_move:
mRecyclerViewAdapter.notifyItemMoved(1,2);
case R.id.menu_addmore:
mTitle.add(0,"test");
mTitle.add(0,"test1");
mTitle.add(0,"test2");
mTitle.add(0,"test3");
mRecyclerViewAdapter.notifyItemRangeInserted(0,4);
mRecyclerView.scrollToPosition(0);
return true;
OK,这样RecyclerView的Adapter更新UI数据的几个高级用法就介绍完了,具体的还要靠自己去实践摸索,去实践摸索,也欢迎大家在下方留言。
[本篇源码下载]
本文已收录于以下专栏:
相关文章推荐
### *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布
相信很多安卓开发的朋友,尤其是刚从事安卓开发的朋友, 当产品经理递过来一张复杂页面的设计图时 , 都会有一种茫然...
近来在做一个Android项目,用到了RecyclerView。相比ListView单调的notifydatasetchanged,RecyclerView在添加/删除Item时有多种方法可以选择。
话说有图有真相,首先来对比一下局部刷新前后的效果:
优化之前的效果:
优化之后的效果:
可以看到,优化之后,列表中的这张大图不在有一闪一闪亮晶晶的效果了!
那么,这是如何做到的呢?这是本...
  RecyclerView的基本使用并不复杂,只需要提供一个RecyclerView.Apdater的实现用于处理数据集与ItemView的绑定关系,和一个RecyclerView....
上一篇介绍的了RecyclerView的基础使用http://blog.csdn.net/leejizhou/article/details/,这一篇给大家介绍下如何利用Recycle...
上一章主要介绍了RecycleView的基本使用,但是相对于ListView还是少一个东西——分割线。上一章有提到RecycleView添加分割线的方法:RecycleView.addItem...
注意:使用notifyItemRemoved(position)更新数据之前,还必须集合中删除该数据:mDatas.remove(position),否则不更新。
更新数据 
这里更新数据集不...
关键:public final void notifyItemChanged(int position, Object payload)RecyclerView局部刷新大家都遇到过,有时候还说会遇见图...
这篇介绍下如何为RecyclerView添加下拉刷新和上拉加载,过去在ListView当中添加下拉刷新和上拉加载是非常方便的利用addHeaderView和addFooterView,Recycler...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 我的世界改变时间 的文章

 

随机推荐