1.简介
RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持。RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
总之ListView和GridView能做的RecyclerView都能做,并且能实现瀑布流效果
2.使用
class="brush:java;gutter:true;">在build.gradle配置RecyclerView的库 compile 'com.android.support:recyclerview-v7:23.3.0'
//设置RecyclerView的适配器 adapter = new MyRecyclerViewAdapter(RecyclerViewActivity.this,datas); recyclerview.setAdapter(adapter); //LayoutManager recyclerview.setLayoutManager(new LinearLayoutManager(RecyclerViewActivity.this, LinearLayoutManager.VERTICAL, false)); // recyclerview.scrollToPosition(datas.size()-1); //添加RecyclerView的分割线 recyclerview.addItemDecoration(new DividerListItemDecoration(RecyclerViewActivity.this,DividerListItemDecoration.VERTICAL_LIST)); //设置动画 recyclerview.setItemAnimator(new DefaultItemAnimator());
public class MyAdapter extends  RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private final Context context;
    private final ArrayList<String> datas;
   
    public MyAdapter(Context context,ArrayList<String> datas){
        this.context = context;
        this.datas = datas;
    }
    /**
     * 相当于ListView适配器中的getView的创建holder布局
     *
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = View.inflate(context, R.layout.item_hello, null);
        return new MyViewHolder(view);
    }
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.tv_text.setText(datas.get(position));
        holder.iv_icon.setBackgroundResource(R.mipmap.ic_launcher);
    }
    @Override
    public int getItemCount() {
        return datas.size();
    }
    class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView tv_text;
        private ImageView iv_icon;
        public MyViewHolder(View itemView) {
            super(itemView);
            tv_text = (TextView) itemView.findViewById(R.id.tv_text);
            iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);
        }
    }
}
3.设置ListView&GridView&瀑布流类型效果
//设置List类型效果 recyclerview.setLayoutManager(new LinearLayoutManager(RecyclerViewActivity.this,LinearLayoutManager.VERTICAL,false)); //设置Grid类型效果 recyclerview.setLayoutManager(new GridLayoutManager(RecyclerViewActivity.this, 2, GridLayoutManager.VERTICAL, false)); //recyclerview.scrollToPosition(99); //设置瀑布流类型效果 recyclerview.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
4.分割线
参照网址:http://blog.csdn.net/lmj623565791/article/details/45059587
//设置分割线-分割线需要自定义&还可以自定义分割线的样式 //没有提供默认的分割线 recyclerview.addItemDecoration(new DividerListItemDecoration(this, DividerListItemDecoration.VERTICAL_LIST));
 
1 public class DividerListItemDecoration extends RecyclerView.ItemDecoration { 2 private static final int[] ATTRS = new int[]{ 3 android.R.attr.listDivider 4 }; 5 6 public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; 7 8 public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; 9 10 private Drawable mDivider; 11 12 private int mOrientation; 13 14 public DividerListItemDecoration(Context context, int orientation) { 15 final TypedArray a = context.obtainStyledAttributes(ATTRS); 16 mDivider = a.getDrawable(0); 17 a.recycle(); 18 setOrientation(orientation); 19 } 20 21 public void setOrientation(int orientation) { 22 if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { 23 throw new IllegalArgumentException("invalid orientation"); 24 } 25 mOrientation = orientation; 26 } 27 28 @Override 29 public void onDraw(Canvas c, RecyclerView parent) { 30 // Log.e("recyclerview - itemdecoration", "onDraw()"); 31 32 if (mOrientation == VERTICAL_LIST) { 33 drawVertical(c, parent); 34 } else { 35 drawHorizontal(c, parent); 36 } 37 38 } 39 40 41 public void drawVertical(Canvas c, RecyclerView parent) { 42 final int left = parent.getPaddingLeft(); 43 final int right = parent.getWidth() - parent.getPaddingRight(); 44 45 final int childCount = parent.getChildCount(); 46 for (int i = 0; i < childCount; i++) { 47 final View child = parent.getChildAt(i); 48 android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext()); 49 final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child 50 .getLayoutParams(); 51 final int top = child.getBottom() + params.bottomMargin; 52 final int bottom = top + mDivider.getIntrinsicHeight(); 53 mDivider.setBounds(left, top, right, bottom); 54 mDivider.draw(c); 55 } 56 } 57 58 public void drawHorizontal(Canvas c, RecyclerView parent) { 59 final int top = parent.getPaddingTop(); 60 final int bottom = parent.getHeight() - parent.getPaddingBottom(); 61 62 final int childCount = parent.getChildCount(); 63 for (int i = 0; i < childCount; i++) { 64 final View child = parent.getChildAt(i); 65 final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child 66 .getLayoutParams(); 67 final int left = child.getRight() + params.rightMargin; 68 final int right = left + mDivider.getIntrinsicHeight(); 69 mDivider.setBounds(left, top, right, bottom); 70 mDivider.draw(c); 71 } 72 } 73 74 @Override 75 public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { 76 if (mOrientation == VERTICAL_LIST) { 77 outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); 78 } else { 79 outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); 80 } 81 } 82 }logs_code_collapse">DividerListItemDecoration
设置分割线样式:
①application设置
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:listDivider">@drawable/divider_bg</item>
</style>
②在activity中
<activity android:name=".recyclerview.RecyclerViewActivity"
    android:theme="@style/listDividerTheme"/>
<style name="listDividerTheme"  parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:listDivider">@drawable/divider_bg</item>
</style>
5.自定义设置item的点击事件
RecyclerView默认是没有点击事件的,需要自定义点击事件
用到知识点:接口,getLayoutPosition()
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
    private final Context context;
    private final ArrayList<String> datas;
    //设置点击某个item的监听
    public interface OnItemClickListener{
         void onItemClick(View view,int position,String content);
    }
    private OnItemClickListener onItemClickListener;
    public void setOnItemClickListener(OnItemClickListener onItemClickListener)   {
        this.onItemClickListener = onItemClickListener;
    }
    //设置点击图片
    public interface OnImageViewClickListener{
        void onImageViewClick(View view,int position);
    }
    private OnImageViewClickListener onImageViewClickListener;
    public void setOnImageViewClickListener(OnImageViewClickListener onImageViewClickListener) {
        this.onImageViewClickListener = onImageViewClickListener;
    }
  ...................................
    class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView tv_text;
        private ImageView iv_icon;
        public MyViewHolder(View itemView) {
            super(itemView);
            tv_text = (TextView) itemView.findViewById(R.id.tv_text);
            iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);
            //设置点击事件
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(onItemClickListener != null){
                        onItemClickListener.onItemClick(v,getLayoutPosition(),datas.get(getLayoutPosition()));
                    }
                }
            });
            //设置监听
            iv_icon.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(onImageViewClickListener != null){
                        onImageViewClickListener.onImageViewClick(v,getLayoutPosition());
                    }
                }
            });
        }
    }
}
在Activity中使用自定义的点击事件
//设置点击item的点击事件
myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position, String content) {
        Toast.makeText(RecyclerViewActivity.this, "content=="+content+",--position=="+position, Toast.LENGTH_SHORT).show();
    }
});
//设置点击某张图片的点击事件
myAdapter.setOnImageViewClickListener(new MyAdapter.OnImageViewClickListener() {
    @Override
    public void onImageViewClick(View view, int position) {
        Toast.makeText(RecyclerViewActivity.this, "position=="+position+",view=="+view.toString(), Toast.LENGTH_SHORT).show();
    }
});
6.删除和增加数据
1_在适配器中新增加添加和删除两个方法
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
	
    ........................
	
    public void addData(int position,String content){
        datas.add(position,content);
        notifyItemInserted(position);
    }
    public void removeData(int position){
        datas.remove(position);
        notifyItemRemoved(position);
    }
}
2_Activity中
btn_add.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		myAdapter.addData(0,"Content NetData");
		//定位到第0个位置
		recyclerview.scrollToPosition(0);
	}
});
btn_remove.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		myAdapter.removeData(0);
	}
});