Android控件大全(三)——RecyclerView

是时候用RecyclerView来替换ListView和GridView了

好处就不多说了,百度一搜一大把,来介绍下用法

先定义个适配器:

public class BottomSheetAdapter extends RecyclerView.Adapter {private  Context context;private  String[] datas;private  int [] icons;private  OnItemClickListener mListener;public  BottomSheetAdapter(Context context,String[] datas,int[] icons){this.context=context;this.datas=datas;this.icons=icons;}@Overridepublic 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;}@Overridepublic void onBindViewHolder(MyViewHolder holder, final int position) {holder.icon.setImageResource(icons[position]);holder.title.setText(datas[position]);holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if(mListener!=null){mListener.OnClick(position);}}});holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {if(mListener!=null){mListener.OnLongClick(position);}return false;}});}@Overridepublic int getItemCount() {return datas.length;}class  MyViewHolder extends RecyclerView.ViewHolder {@BindView(R.id.icon)public ImageView icon;@BindView(R.id.title)public TextView title;public  MyViewHolder(View v){super(v);ButterKnife.bind(this,v);}}//recyclerView 没有点击监听,所以要自己定义public interface  OnItemClickListener{void OnClick(int position);void OnLongClick(int position);}public  void 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() {@Overridepublic 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;}}@Overridepublic 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;}@Overridepublic 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);}}@Overridepublic 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();}@Overridepublic 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;}@Overridepublic 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

 

转载于:https://www.cnblogs.com/lyysz/p/5891851.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部