RecyclerView是Google在5.0中发布的新控件,用来替代ListView,它的使用更加灵活,提供了更好的性能而且更容易使用。该控件是一个可以装载大量的视图集合,并且可以非常效率的进行回收和滚动。当你list中的元素经常动态改变时可以使用RecyclerView控件。
它提供了如下两个功能:
1、为每个条目位置提供了layout管理器(RecyclerView.setLayoutManager)
2、为每个条目设置了操作动画(RecyclerView.setItemAnimator)
一、使用前的准备
使用eclipse的Import导入两个库项目,路径为:你的sdk目录的/extras/android/support/v7:
导入之后把工程改为库项目,之后关联上自己的应用,如果还是无法使用,那么就直接下载我的jar包吧,jar包的使用就不介绍了:recyclerView下载,里面同时提供了CardView的jar包。
如果碰到ClassnotFound:android.support.v7.recyclerview.R.styleable,请使用这个jar包替换:替换jar
准备工作做完之后就可以正式的使用了,先来看下最基本的使用,上效果图:
XML代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
java代码:
public class MainActivity extends Activity {
private RecyclerView recyclerView;
private RecyclerView.Adapter<ViewHolder> adapter;
private List<String> datas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化数据
initData();
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
// 设置是否固定大小
recyclerView.setHasFixedSize(true);
// 使用匿名内部类的形式创建RecyclerView的Adapter
adapter = new Adapter<ViewHolder>() {
// item的数量
@Override
public int getItemCount() {
return datas.size();
}
// 初始化操作
@Override
public ViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {
final View view = LayoutInflater.from(MainActivity.this).inflate(android.R.layout.simple_list_item_1,
null);
return new MyViewHolder(view);
}
// 在这里添加视图
@Override
public void onBindViewHolder(ViewHolder viewHolder, int arg1) {
((MyViewHolder) viewHolder).txtv.setText(datas.get(arg1));
}
};
// 使用线性布局
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
// 设置动画
recyclerView.setItemAnimator(new DefaultItemAnimator());
// 设置适配器
recyclerView.setAdapter(adapter);
}
// 内部类用来创建ViewHolder
public static class MyViewHolder extends ViewHolder {
public TextView txtv;
public MyViewHolder(View itemView) {
super(itemView);
txtv = (TextView) itemView.findViewById(android.R.id.text1);
}
}
// 初始化数据
private void initData() {
datas = new ArrayList<String>();
datas.add("小红1");
datas.add("小红2");
datas.add("小红3");
datas.add("小红4");
datas.add("小红5");
datas.add("小红6");
datas.add("小红7");
}
}
// 添加分割线
recyclerView.addItemDecoration(new ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {
super.getItemOffsets(outRect, view, parent, state);
}
@Override
public void onDraw(Canvas c, RecyclerView parent, State state) {
super.onDraw(c, parent, state);
Log.e("", "onDraw");
// 初始化画笔
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setDither(true);
paint.setColor(Color.RED);
// 开始画
for (int i = 0, size = parent.getChildCount(); i < size; i++) {
View view = parent.getChildAt(i);
c.drawLine(view.getLeft(), view.getBottom(),
((WindowManager) parent.getContext().getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getWidth(),
view.getBottom(), paint);
}
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, State state) {
super.onDrawOver(c, parent, state);
Log.e("", "onDrawOver");
}
});
上效果图:
啊哈~~~~~~~~~简单粗暴的演示了一下界面,怎么添加点击事件呢???????????下面来添加item的点击事件:
如果你也是一个喜欢简单粗暴的直性子,那么我恭喜你,实现这个很容易,直接在adapter里的onBindViewHolder方法里面设置监听就好了,代码如下:
// 在这里添加视图
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int arg1) {
((MyViewHolder) viewHolder).txtv.setText(datas.get(arg1));
//添加监听
((MyViewHolder)viewHolder).txtv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "你点到我啦~" + arg1, Toast.LENGTH_SHORT).show();
}
});
}
来个动态图片小小的演示一下~~~~~:
不过这个点击事件是有一定的缺陷的,就是只能在View大小内点击,不能再整个item点击。当然你也可以使用接口回调的方式把点击事件引出来,这里我就不再演示了,那么RecyclerView的演示就到这里吧,有时间再深入的研究一下。最后提供demo下载:demo下载
扫描关注我的微信公众号: