前言
在android常用组件中ListView是我们手中的常客 , 几乎没有一个APP不使用这个组件的 , 我们为他添加下拉刷新 , 为他添加上拉加载 , 为他的每个Item写动画效果 , 几乎一个APP的很多工作 , 都耗费在了ListView上面 。每次写Adapter几乎都要为其手动实现一个ViewHolder,即使自己封装了ViewHolder ,但灵活性也就缺失了 , 如果将列表转换成gridView对与listView就会很麻烦 , 但是对于RecyclerView确实轻而易举 , 不管是竖直还是水平 ,他都能友好的完成任务 , 简直是我们android程序员的好伙伴 , 你一定要学会他 。
RecyclerView
是个容器类 , google也给我们提供了一个兼容类 ,在V7包中 , 路径如下图:
如果是IDE是eclipse的话, 找到这个包 , 将其拷贝到Lib下 , 就可以使用了 , 下面我们看看布局怎么用 :
<android.support.v7.widget.RecyclerView
android:background="#33ddee"
android:id="@+id/rvBasicRecyclerView"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
用法很简单 ,和普通控件一样, 最为关键的是 , 编写我们的Adapter
类。 我们需要编写一个Adapter
类来继承至RecyclerView.Adapter
,实现onCrateViewHolder
和onBindViewHolder
两个方法 。一个用于创建单个Item视图对象 , 相当于ListView
中的getView()
方法,提供一个Item的视图对象 。一个是将我们Item中的组件与数据相关连 。下面我们看用法 :
package com.zhuyongit.recyclerviewdemo.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.zhuyongit.recyclerviewdemo.R;
import com.zhuyongit.recyclerviewdemo.bean.NewsBean;
import java.util.List;
/**
* @author zeno
*
* @email zhuyongluck@qq.com
*
* @website http://www.zhuyongit.com
*
* @version 1.0
*
* RecyclerView基本使用 ,类似ListView控件 , 列表显示
*/
public class BasicRecyclerAdapter extends RecyclerView.Adapter{
private static final String TAG = "BasicRecyclerAdapter" ;
private List<NewsBean> mDatas ;
private OnLongClickListener mOnLongClickListener ;
public BasicRecyclerAdapter(List<NewsBean> datas) {
this.mDatas = datas;
}
/**
* 创建一个ViewHolder 复用控件对象
*/
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView tvTitle ;
private TextView tvContent ;
public ViewHolder(View rootView) {
super(rootView);
tvTitle = (TextView) rootView.findViewById(R.id.tvTitle);
tvContent = (TextView) rootView.findViewById(R.id.tvContent);
/**
* 设置RecyclerView 单个Item对象长按事件
*/
rootView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mOnLongClickListener.onLongCick(v, getLayoutPosition());
return false;
}
});
}
public TextView getTvTitle() {
return tvTitle;
}
public TextView getTvContent() {
return tvContent;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 返回单个Item的View对象
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.basic_recycler_item_layout,parent,false) ;
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// 将数据绑定到控件上
ViewHolder _viewHolder = (ViewHolder) holder;
NewsBean _newsBean = (NewsBean) mDatas.get(position);
_viewHolder.getTvTitle().setText(_newsBean.getTitle());
_viewHolder.getTvContent().setText(_newsBean.getContent());
}
@Override
public int getItemCount() {
return mDatas.size();
}
/**
* 向RecyclerView添加单个Item
* @param position
*/
public void addItem(int position) {
mDatas.add(position, new NewsBean("落花虽有意", "奈何流水却无情"));
// 插入Item的时候刷新单个Item
notifyItemInserted(position);
}
/**
* 删除ReclcerView单个Item
* @param position
*/
public void deleteItem(int position) {
mDatas.remove(position) ;
// 移除Item的时候刷新单个Item
notifyItemRemoved(position);
}
/**
* 设置单个Item的长按事件
* @param listener
*/
public void setOnLongClickListener(OnLongClickListener listener) {
this.mOnLongClickListener = listener ;
}
/**
* 定义个长按事件接口 , 用于向外部提供长按事件处理接口
*/
public interface OnLongClickListener {
public void onLongCick(View view , int position) ;
}
}
因为RecyclerView
容器的特性 , 所以google连Item之间的divider线也不给我们提供 , 需要我们自己去实现 ,addItemDecoration()
方法可以指定Item之间的divider , 实现Item divider 的效果有很多方法 ,我这边直接指定的margin设置的 , 各位看官可根据自己的喜好 , 自行设置 。RecyclerView还有一个比较好的方法就是setItemAnimator(new DefaultItemAnimator())
, 可以自定义Item的动画效果 , 这里实现了一个系统默认的动画效果 。
效果图 :