您的位置:首页 > 其它

RecyclerView用法基本解析

2016-12-20 10:17 393 查看
今天刚刚查看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>

此时运行项目,分割线已经变为自定义的线了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: