Android 5.0新增一个控件RecyclerView,它是对ListView的升级。每当一个新的事物出来,我们就应该了解下,下面说说它的用法。
1.在Module 下的build.gradle下添加依赖。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:23.4.0'
testCompile 'junit:junit:4.12'
//noinspection GradleCompatible//需要添加的
compile 'com.android.support:recyclerview-v7:23.4.0'
}
2.和使用ListView一样,在布局文件中使用RecyclerView控件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="so.wih.android.huweidemo_recyclerview.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
/>
</RelativeLayout>
3.RecyclerView的使用比ListView复杂,因为它的功能更多更强大,需要设置的也多。①.设置LayoutManager(布局管理器)。LayoutManager有三种常见模式:线性LinearLayoutManager、与GridView效果对应的是GridLayoutManager、与瀑布流对应的还有StaggeredGridLayoutManager。②设置增加或删除条目的动画
public class MainActivity extends AppCompatActivity {
private MyAdapter mAdapter;
public String [] getDummyDatas = {"听见你的声音","匹诺曹","Doctor异乡人","学校2013","W两个世界"
,"听见你的声音","匹诺曹","Doctor异乡人","学校2013","W两个世界",
"听见你的声音","匹诺曹","Doctor异乡人","学校2013","W两个世界",
"听见你的声音","匹诺曹","Doctor异乡人","学校2013","W两个世界",
"听见你的声音","匹诺曹","Doctor异乡人","学校2013","W两个世界"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
//创建默认的线性LayoutManager
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置增加或删除条目的动画
mRecyclerView.setItemAnimator( new DefaultItemAnimator());
//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
mRecyclerView.setHasFixedSize(true);
//创建并设置Adapter
mAdapter = new MyAdapter(getDummyDatas);
mRecyclerView.setAdapter(mAdapter);
}
4.RecyclerView的适配器。我们的adapter需要继承RecyclerView.Adapter。RecylerView封装了viewholder的回收复用,也就是说RecylerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的逻辑被封装了,写起来更加简单。
①onCreateViewHolder()
这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。
②onBindViewHolder()
这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。
③getItemCount()
这个方法就类似于BaseAdapter的getCount方法了,即总共有多少个条目。
当我自己写的时候发现和别人写的不一样,原因是我的onCreateViewHolder方法返回的是RecyclerView.ViewHolder;onBindViewHolder方法的第一个参数也是RecyclerView.ViewHolder。达不到复用的效果
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
private final String[] datas;
public MyAdapter(String[] data){
this.datas = data ;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item, null);
ViewHolder vh = new ViewHolder(view);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.tv.setText(datas[position]);
}
@Override
public int getItemCount() {
return datas.length;
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView tv;
public ViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.textview);
}
}
}
5.给RecyclerView的Item添加点击事件
public OnItemClickListener mOnItemClickListener ;
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.mOnItemClickListener = onItemClickListener ;
}
interface OnItemClickListener{
void onClick(int position);
void onLongClick(int position);
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.tv.setText(datas[position]);
// textView.setText(datas[position]);
if(mOnItemClickListener != null){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onClick(position);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mOnItemClickListener.onLongClick(position);
return false;
}
});
}
}
更多详细使用方法可以参考大神的文章:http://blog.youkuaiyun.com/lmj623565791/article/details/45059587