丈夫欲遂平生志,一载寒窗一举汤。这篇文章主要讲述Android控件大全——RecyclerView相关的知识,希望能为你提供帮助。
是时候用RecyclerView来替换ListView和GridView了
好处就不多说了,百度一搜一大把,来介绍下用法
先定义个适配器:
public class BottomSheetAdapter extends RecyclerView.Adapter< BottomSheetAdapter.MyViewHolder> {privateContext context; privateString[] datas; privateint [] icons; privateOnItemClickListener mListener; publicBottomSheetAdapter(Context context,String[] datas,int[] icons){ this.context=context; this.datas=datas; this.icons=icons; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View v= LayoutInflater.from(context).inflate(R.layout.bottom_recycle_layout,null); MyViewHolder holder=new MyViewHolder(v); return holder; }@Override public void onBindViewHolder(MyViewHolder holder, final int position) { holder.icon.setImageResource(icons[position]); holder.title.setText(datas[position]); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mListener!=null){ mListener.OnClick(position); } } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if(mListener!=null){ mListener.OnLongClick(position); } return false; } }); }@Override public int getItemCount() { return datas.length; }classMyViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.icon) public ImageView icon; @BindView(R.id.title) public TextView title; publicMyViewHolder(View v){ super(v); ButterKnife.bind(this,v); } }//recyclerView 没有点击监听,所以要自己定义 public interfaceOnItemClickListener{ void OnClick(int position); void OnLongClick(int position); }publicvoid setOnItemClickListener(OnItemClickListener listener){ this.mListener=listener; }}
使用:
View bottom= LayoutInflater.from(context).inflate(R.layout.bottom_sheet_layout,null); RecyclerView recyclerView= (RecyclerView) bottom.findViewById(R.id.recycle); String[] datas=new String[]{"相机","从图片中选取","取消"}; int[] icons=new int[]{R.mipmap.camera,R.mipmap.picture,R.mipmap.cancle}; BottomSheetAdapter adapter=new BottomSheetAdapter(context,datas,icons); adapter.setOnItemClickListener(new BottomSheetAdapter.OnItemClickListener() { @Override public void OnClick(int position) { switch (position){ case 0: dialog.hide(); ((NoteAddActivity)context).openCamera(); break; case 1: dialog.hide(); ((NoteAddActivity)context).openGallery(); break; case 2: dialog.hide(); break; default: break; } } @Override public void OnLongClick(int position) { Snackbar.make(finalConvertView,"onlongclcik="+position,Snackbar.LENGTH_SHORT).show(); } }); recyclerView.setAdapter(adapter); recyclerView.addItemDecoration(new DividerItemDecoration(context,LinearLayoutManager.VERTICAL)); recyclerView.setLayoutManager(new LinearLayoutManager(context)); dialog.setContentView(bottom); dialog.show();
分割线需要自己定义,抄两个过来:
listview的分割
public class DividerItemDecoration extends RecyclerView.ItemDecoration {private static final int[] ATTRS = new int[]{ android.R.attr. listDivider }; public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; private Drawable mDivider; private int mOrientation; public DividerItemDecoration(Context context, int orientation) { final TypedArray a = context.obtainStyledAttributes(ATTRS ); mDivider = a.getDrawable(0); a.recycle(); setOrientation(orientation); }public void setOrientation( int orientation) { if (orientation != HORIZONTAL_LIST & & orientation != VERTICAL_LIST) { throw new IllegalArgumentException( "invalid orientation"); } mOrientation = orientation; }@Override public void onDraw(Canvas c, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } }public void drawVertical(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } }public void drawHorizontal(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } }@Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); }else{ outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } }}
gridview的分割
public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {private static final int[] ATTRS = new int[] { android.R.attr.listDivider }; private Drawable mDivider; public DividerGridItemDecoration(Context context) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); }@Override public void onDraw(Canvas c, RecyclerView parent, State state) {drawHorizontal(c, parent); drawVertical(c, parent); }private int getSpanCount(RecyclerView parent) { // 列数 int spanCount = -1; LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) {spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { spanCount = ((StaggeredGridLayoutManager) layoutManager) .getSpanCount(); } return spanCount; }public void drawHorizontal(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getLeft() - params.leftMargin; final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } }public void drawVertical(Canvas c, RecyclerView parent) { final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getTop() - params.topMargin; final int bottom = child.getBottom() + params.bottomMargin; final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicWidth(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } }private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) { LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边 { return true; } } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager) .getOrientation(); if (orientation == StaggeredGridLayoutManager.VERTICAL) { if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边 { return true; } } else { childCount = childCount - childCount % spanCount; if (pos > = childCount)// 如果是最后一列,则不需要绘制右边 return true; } } return false; }private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) { LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { childCount = childCount - childCount % spanCount; if (pos > = childCount)// 如果是最后一行,则不需要绘制底部 return true; } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager) .getOrientation(); // StaggeredGridLayoutManager 且纵向滚动 if (orientation == StaggeredGridLayoutManager.VERTICAL) { childCount = childCount - childCount % spanCount; // 如果是最后一行,则不需要绘制底部 if (pos > = childCount) return true; } else // StaggeredGridLayoutManager 且横向滚动 { // 如果是最后一行,则不需要绘制底部 if ((pos + 1) % spanCount == 0) { return true; } } } return false; }@Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { int spanCount = getSpanCount(parent); int childCount = parent.getAdapter().getItemCount(); if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部 { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边 { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight()); } } }
具体参考:http://blog.csdn.net/lmj623565791/article/details/45059587
【Android控件大全——RecyclerView】
推荐阅读
- Android SurfaceView + MediaPlayer实现分段视频无缝播放
- Android 内存优化,如何避免OOM
- Android 自定义View,仿微信视频播放按钮
- Android 等比例缩放图片
- Android数据加密之Base64编码算法
- Android 内存管理机制详解
- android四大组件(详细总结)
- 实现类知乎android客户端关注和取消关注的按钮点击效果
- Android Studio 2.2 来啦