1、引入v7包和recyclerview包。
2、使用recyclerview ,
布局或者代码创建实例
设置布局管理器,可以加入对Item的修饰
设置adapter。
布局中加入
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@drawable/divider"
android:padding="20dp"/>
1、引用以及设置LayoutMananger、adapter、decoration
recycler_view = findViewById(R.id.recycler_view);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recycler_view.setLayoutManager(linearLayoutManager);
recycler_view.addItemDecoration(new ItemDivederDecoration(this,ItemDivederDecoration.ORIENTATION_HORIZONTAL));
recycler_view.setAdapter(new RecyclerViewAdapter());
2、adapter的代码如下
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ItemViewHolder> {
@Override
public int getItemCount() {
return 20;
}
@NonNull
@Override
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new ItemViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item,viewGroup,false));
}
@Override
public void onBindViewHolder(@NonNull ItemViewHolder viewHolder, int i) {
viewHolder.title.setText("HAHAH "+ i);
}
class ItemViewHolder extends RecyclerView.ViewHolder{
private TextView title;
public ItemViewHolder(@NonNull View itemView) {
super(itemView);
title = (TextView) itemView;
}
}
}
adapter继承自RecyclerView.Adapter<T extends ViewHloder>,实现关键的三个抽象方法,
getItemCount()决定这个列表内有几个item的即列表内元素数量的方法,
onCreateViewHolder()是创建ViewHolder的方法
onBindViewHolder(),对viewholder内的view进行状态设置的方法。
另外还有实现的ViewHolder作为onCreateViewHolder中返回的ViewHolder。
3、LayoutManager
support中实现了三种Layoutmanager:线性,grid,瀑布流。
4、decoration,对列表内的元素进行装饰的类,继承自ItemDecoration,下面是对线性的一个实现,
public class ItemDivederDecoration extends RecyclerView.ItemDecoration {
private static final String TAG = "ItemDivederDecoration";
public static final int ORIENTATION_HORIZONTAL = LinearLayoutManager.HORIZONTAL;
public static final int ORIENTATION_VERTICAL = LinearLayoutManager.VERTICAL;
@IntDef({ORIENTATION_HORIZONTAL, ORIENTATION_VERTICAL})
@Retention(RetentionPolicy.SOURCE)
public @interface OrientationCheck {
}
int[] attrs = new int[]{
android.R.attr.listDivider
};
private int orientation;
private Drawable mDividerDrawable;
public ItemDivederDecoration(Context context, @OrientationCheck int orientation) {
TypedArray ta = context.obtainStyledAttributes(attrs);
mDividerDrawable = context.getResources().getDrawable(R.drawable.divider);
//ta.getDrawable(0);
ta.recycle();
setOrientation(orientation);
}
public void setOrientation(int orientation) {
this.orientation = orientation;
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
if (orientation==ORIENTATION_HORIZONTAL){
outRect.set(0,0,mDividerDrawable.getIntrinsicWidth(),0);
}else {
outRect.set(0,0,0,mDividerDrawable.getIntrinsicHeight());
}
}
@Override
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.onDraw(c, parent, state);
if (orientation == ORIENTATION_HORIZONTAL) {
drawHorizontal(c, parent);
} else {
drawVertical(c, parent);
}
}
private void drawVertical(Canvas c, RecyclerView parent) {
int paddingLeft = parent.getPaddingLeft();
int paddingRight = parent.getWidth()-parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View childView = parent.getChildAt(i);
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) childView.getLayoutParams();
int top = childView.getBottom()+ layoutParams.bottomMargin;
int bottom = top+mDividerDrawable.getIntrinsicHeight();
mDividerDrawable.setBounds(paddingLeft,top,paddingRight,bottom);
mDividerDrawable.draw(c);
}
}
private void drawHorizontal(Canvas c, RecyclerView parent) {
int top = parent.getPaddingTop();
int bottom = parent.getHeight() - parent.getPaddingBottom();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View childView = parent.getChildAt(i);
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) childView.getLayoutParams();
int left = childView.getRight()+layoutParams.rightMargin;//getRight不能使用getWidth代替
int right = left+mDividerDrawable.getIntrinsicWidth();
mDividerDrawable.setBounds(left,top,right,bottom);
mDividerDrawable.draw(c);
}
}
}
上方主要实现了两个方法,onDraw和getItemOffsets两个方法。onDraw()在指位置画一个分割线,getItemOffsets设置对Item的偏移。
有了这些就实现了一个展示,对于点击事件可能也需要我们可以在Adapter或者ViewHolder中实现。