今天刚刚查看recyclerview用法,写了最简单的测试用法
首先,主布局,即为一个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>
此时运行项目,分割线已经变为自定义的线了