RecyclerView用法基本解析
2016-12-20 10:17
393 查看
今天刚刚查看recyclerview用法,写了最简单的测试用法
首先,主布局,即为一个v7包下的 Recyclerview
其次是 主Activity adapter写在了activity里面
现在就可以运行了,每个item是一个textview数字 看起来和listview一样,但是没有分隔线
想要增加分隔线,需要重写类继承ItemDecoration
如下
写了之后,需要在主布局里面设置,添加
现在运行项目已经有分隔线了,分割线是系统自带的线
如果想要自己定义分隔线样式,需要在项目values--styles中添加一个item即可 如
后面的@drawable/rv_drawable即为自己定义的drawable分隔线样式
如定义一个名为rv_drawable的横线shape,如下
此时运行项目,分割线已经变为自定义的线了
首先,主布局,即为一个v7包下的 Recyclerview
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_text_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="ht.testxyapp.com.testapp.activity.TextRecyclerViewActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/rvView" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> </RelativeLayout>
其次是 主Activity adapter写在了activity里面
public class TextRecyclerViewActivity extends Activity { private RecyclerView rvView; private List<String> datas; private RvAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_text_recycler_view); initDatas(); rvView = (RecyclerView) findViewById(R.id.rvView); rvView.setLayoutManager(new LinearLayoutManager(this)); rvView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST)); adapter = new RvAdapter(); rvView.setAdapter(adapter); } private void initDatas() { datas = new ArrayList<>(); for (int i = 0; i < 100; i++) { datas.add(i + "**"); } } private class RvAdapter extends RecyclerView.Adapter<RvAdapter.MyViewHolder> { @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder = new MyViewHolder(LayoutInflater.from(TextRecyclerViewActivity.this) .inflate(R.layout.textrv_item, parent,false)); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.tv.setText(datas.get(position)); } @Override public int getItemCount() { return datas.size(); } class MyViewHolder extends RecyclerView.ViewHolder { TextView tv; public MyViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.tv); } } } }
现在就可以运行了,每个item是一个textview数字 看起来和listview一样,但是没有分隔线
想要增加分隔线,需要重写类继承ItemDecoration
如下
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 mDiliver; private int mOrientation; public DividerItemDecoration(Context context, int orientation) { final TypedArray ta = context.obtainStyledAttributes(ATTRS); mDiliver = ta.getDrawable(0); ta.recycle(); } public void setOrientation(int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid exception"); } mOrientation = orientation; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); if (mOrientation == VERTICAL_LIST){ drawHorizontal(c,parent); }else{ drawVertical(c,parent); } } public void drawVertical(Canvas c,RecyclerView rv){ final int left = rv.getPaddingLeft(); final int right = rv.getWidth() - rv.getPaddingRight(); final int childCount = rv.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = rv.getChildAt(i); android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(rv.getContext()); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDiliver.getIntrinsicHeight(); mDiliver.setBounds(left, top, right, bottom); mDiliver.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 + mDiliver.getIntrinsicHeight(); mDiliver.setBounds(left, top, right, bottom); mDiliver.draw(c); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); if (mOrientation == VERTICAL_LIST){ outRect.set(0,0,0,mDiliver.getIntrinsicHeight()); }else{ outRect.set(0,0,mDiliver.getIntrinsicWidth(),0); } } }
写了之后,需要在主布局里面设置,添加
rvView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
现在运行项目已经有分隔线了,分割线是系统自带的线
如果想要自己定义分隔线样式,需要在项目values--styles中添加一个item即可 如
<item name="android:listDivider">@drawable/rv_drawable</item>
后面的@drawable/rv_drawable即为自己定义的drawable分隔线样式
如定义一个名为rv_drawable的横线shape,如下
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <gradient android:centerColor="#ff00ff00" android:endColor="#ff0000ff" android:startColor="#ffff0000" android:type="linear" /> <size android:height="4dp" /> </shape>
此时运行项目,分割线已经变为自定义的线了
相关文章推荐
- android RecyclerView的基本介绍及用法(一)
- RecyclerView的基本用法二--滚动时RecyclerView之外的布局联动
- RecyclerView的基本用法
- Android中RecyclerView的基本用法
- RecyclerView的基本用法
- android 5.0新特性,recyclerview的基本用法,及应注意的问题
- RecyclerView的基本用法,下拉刷新下拉加载以及item的增删
- Android 5.X新特性之RecyclerView基本解析及无限复用
- RecyclerView更全解析之 - 基本使用和分割线解析
- RecyclerView的基本用法 (四)
- Android 5.X新特性之RecyclerView基本解析及无限复用
- RecyclerView的基本用法:深入研究 (六)
- Android的ListView和RecyclerView的基本用法
- RecyclerView的基本用法 (二)
- RecyclerView的基本用法
- RecyclerView基本用法
- RecyclerView基本用法:CascadeView (七)
- RecyclerView基本使用用法
- RecyclerView的基本用法
- RecyclerView的基本用法