简介:
RecyclerView是ListView的一个更高级和灵活的版本。
使用RecycleView必须指定一个adapter(适配器)和一个layout manager(布局管理器)。创建一个adapter继承自RecycleView.Adapter类
layout manager用于RecyclerView里面视图的定位和确定未显示的视图的重新显示。
RecyclerView提供了一下几种内置的layout manager:
LinearLayoutManage以垂直或水平的滚动列表显示
GridLayoutManager以网格的形式显示
StaggeredGridLayoutManager 以交错网格显示
若创建一个自定义的layout manager,需继承自 RecyclerView.LayoutManager类。
使用实例:
1,首先在项目中引入recyclerview的依赖
2,在布局文件中添加RecyclerView
<!-- A RecyclerView with some commonly used attributes -->
<android.support.v7.widget.RecyclerView
android:id
=
"@+id/my_recycler_view"
android:scrollbars
=
"vertical"
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
/>
3,与layout manager关联起来
public class MyActivity extends Activity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
// 如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
mRecyclerView.setHasFixedSize(true);
// 使用线性布局
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
// 指定一个adapter (见下一步)
mAdapter = new MyAdapter(myDataset);
mRecyclerView.setAdapter(mAdapter);
}
...
}
4,建立adapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private String[] mDataset;
// 在ViewHolder中提供提供每个列表项所需要的所有views,如使用findViewById方法
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
//ViewHolder的构造函数
public ViewHolder(TextView v) {
super(v);
mTextView = (TextView)v.findViewById(R.id.text);
}
}
// MyAdapter的构造函数 (依赖数据的类型,可为list<>、数组等)
public MyAdapter(String[] myDataset) {
mDataset = myDataset; //此例为String[]数组类型
}
// 创建一个新的ViewHolder
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// 加载布局并转化为View, my_text_view布局自己创建
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_text_view, parent, false); //false不要忘
// 可以设置view的布局参数
...
//将V传递给RecycleView封装好的ViewHolder
ViewHolder vh = new ViewHolder(v);
return vh;
}
// 更新ViewHolder里面的数据
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// 用你数据源的元素代替此position上的内容
holder.mTextView.setText(mDataset[position]);
}
// 返回数据源的大小
@Override
public int getItemCount() {
return mDataset.length;
}
}
5,添加点击事件(全部在自定义的MyAdapter中实现,观察者模式)
①在MyAdapter中定义如下接口
public static interface onRecyclerViewItemClickListener {
void onItemClick(View view,String data);
}
②声明这个借口的变量
private onRecyclerViewItemClickListener mItemClickListener = null;
③为暴露给外面的调用者,定义一个设置Listener的方法(),如下:
public void setOnItemClickListener(onRecyclerViewItemClickListener listener) {
this.mItemClickListener = listener;
}
④为MyAdapter实现OnClickListener方法(
注意:别忘了实现View.OnClickListener 接口)
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener{
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item,parent,false);
ViewHolder vh = new ViewHolder(v);
v.setOnClickListener(this);
//将v注册点击事件
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mTextView.setText(myData.get(position).getTitle());
holder.mImageView.setImageResource(R.mipmap.ic_launcher);
holder.itemView.setTag(myData.get(position));//将数据保存在itemView的Tag中,以便点击时进行获取
}
@Override
public void onClick(View v) {
if (mItemClickListener != null) {
mItemClickListener.onItemClick(v, (String) v.getTag());//注意这里使用getTag方法获取数据
}
}
}
此时我们就可以在Activity或其他地方为RecyclerView添加项目点击事件了,如下:
private MyAdapter adapter;
(注意:若写成private RecyclerView.Adapter adapter;则不会实现adapter
.setOnItemClickListener()方法
)
adapter = new MyAdapter(titleList);
mRecyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(new MyAdapter.onRecyclerViewItemClickListener() {
@Override
public void onItemClick(View view, String data) {
//实现自己的点击事件
}
});
6,添加删除数据
以前在ListView当中,我们只要修改后数据用Adapter的notifyDatasetChange一下就可以更新界面。然而在RecyclerView中还有一些更高级的用法:
添加数据:
public void addItem(DataModel content, int position) {
datas.add(position, content);
notifyItemInserted(position); //Attention!
}
删除数据:
public void removeItem(DataModel model) {
int position = datas.indexOf(model);
datas.remove(position);
notifyItemRemoved(position);//Attention!
}
值得注意的是RecyclerView的添加删除都是有默认的动画效果的,如果没有效果可以添加如下代码:
mRecyclerView.setItemAnimator(newDefaultItemAnimator());