在V7包中发现RecycleView的jar包,API和网上资料得出,它就是可以代替ListView、GridView的View控件,介绍中它强制使用了ViewHolder类,需要我们做好回收和复用View就好,经过简单的了解,发现和我们常用的ListView和GridView还是区别很大的,不过目前没发现项目中要去使用它,初步了解学习;
这个RecyclerView 是在什么环境下开发呢,这个需要我们引用V7-RecyclerView的jar包,在SDK支持包libs下可找到。
首先呢,引入jar包后就可以使用recyclerView了;了解下它是干嘛的:
不关心Itme是否现在在正确的位置,如何显示。
LayoutManager
不关心Item间如何分隔
ItemDecoration
不关注Item增加与删除的动画效果
ItemAnimator
仅仅关注如何回收与复用View
看代码:
初始化完成后
<span style="white-space:pre"> </span>//设置RecycleView的管理器
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(manager);
写入Adapter:
<span style="white-space:pre"> </span><pre name="code" class="java"><span style="white-space:pre"> </span>//添加事件的点击事件
public interface OnItemClickListener{
public void onItemClick(View itemView, int pos);
public void onItemLongClick(View itemView, int pos);
}
class MyAdapter extends RecyclerView.Adapter<MyViewHolder>{
private OnItemClickListener mOnItemClickListener;
public void setOnItemClickListener(OnItemClickListener listener){
this.mOnItemClickListener = listener;
}
private List<String> list;
private Context mContext;
private LayoutInflater inflater;
public MyAdapter(Context context,List<String> arry) {
mContext = context;
list = arry;
inflater = LayoutInflater.from(mContext);
}
@Override
public int getItemCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public void onBindViewHolder(final MyViewHolder arg0, final int arg1) {
arg0.tv.setText(list.get(arg1));
// 设置点击事件
if(mOnItemClickListener!=null){
//点击事件
if(!isLongClick){
arg0.itemView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int pos = arg0.getLayoutPosition();
mOnItemClickListener.onItemClick(arg0.itemView,pos);
isLongClick = false;
}
});
}
//长按事件
arg0.itemView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int pos = arg0.getLayoutPosition();
mOnItemClickListener.onItemLongClick(arg0.itemView,pos);
isLongClick = true;
return false;
}
});
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {
View view = inflater.inflate(R.layout.recycler_item, arg0, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
public void add(int pos){
list.add(pos,"1111");
notifyItemInserted(pos);
}
public void detele(int pos){
list.remove(pos);
notifyItemRemoved(pos);
}
}
class MyViewHolder extends ViewHolder{
private TextView tv;
public MyViewHolder(View arg0) {
super(arg0);
tv = (TextView) arg0.findViewById(R.id.textView1);
}
}
可以看出和常使用的ListView使用的BaseAdapter有很大区别,让我们强制使用了ViewHolder这个类,上面点击Item做了一个简单的回调处理,方便Activity中直接调用,当然我们写的时候可以分开去写,无效判断长按;
int pos = arg0.getLayoutPosition();这个点注意是把每次增加删除后的item ID获取到,因为每次add后是notifyItemInserted(pos);没有重新适配整个布局,所以需要调用
getLayoutPosition();
<span style="font-family:微软雅黑, MS Sans Serif, sans-serif;"><span style="white-space:pre"> </span>上面说到RecyclerView没有分割线和动画,这个时候需要我们自己去处理,根据项目需求去写:</span>
<span style="font-family:微软雅黑, MS Sans Serif, sans-serif;"><span style="white-space:pre"> </span>例如:</span>
<span style="font-family:微软雅黑, MS Sans Serif, sans-serif;"><span style="white-space:pre"></span></span><pre name="code" class="java"><span style="white-space:pre"> </span>recyclerView.setItemAnimator(new DefaultItemAnimator());
//recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
更多的原理可以看下API,我实验完成后,没发现这个View吸引处在哪,不过作为谷歌推出的应该学习,如果项目中有需求比如ListView和GridView互换展示效果,可以选择这个View,方便,listView->GridView只需要我们
<pre name="code" class="java">recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
几张效果图:刷新的功能网上很多,大家可以参考;
<img src="https://img-blog.csdn.net/20150806104624946?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20150806104636483?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20150806104646919?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />