RecycleView继承自ViewGroup,是一堆控件的集合。
因为继承自ViewGroup,所以它提供一些类来实现布局:
- LayoutManager 布局管理器
- ViewHolder 控件容器
- Adapter 控件适配器
1.LayoutManager
分位三种:
GridLayoutManager 网格布局管理器
LinearLayoutManager 线性布局管理器
StaggeredGridLayoutManager 流式布局管理器
2.ViewHolder
主要靠继承RecycleView自带的Holder,实现构造方法,在自定义的Holder里面获取到布局里面的单个的控件
class MyHolder extends RecyclerView.ViewHolder{
TextView title_txt;
TextView content_txt;
public MyHolder(View itemView) {
super(itemView);
title_txt = (TextView) itemView.findViewById(R.id.title);
content_txt = (TextView) itemView.findViewById(R.id.content);
}
}
3.Adapter
自定义Adapter里面实现三个方法:
- onCreateViewHolder
返回值为一个holder,可以根据不同条件返回不同的item的layout
- onBindViewHolder
将数据展示在指定的position上面
- getItemCount
返回adapter里面item的条数
class MyAdapter extends RecyclerView.Adapter{
private Context mContext;
private List<CardModel> mList;
public MyAdapter(Context context, List<CardModel> list){
this.mContext = context;
this.mList = list;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.card_item_layout, parent, false);
CardView cardView = (CardView) view.findViewById(R.id.card_view);
cardView.setCardBackgroundColor(Color.parseColor("#00FF00"));
cardView.setCardElevation(20);
cardView.setContentPadding(20,20,20,20);
cardView.setRadius(10);
return new MyHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
((MyHolder)holder).title_txt.setText(mList.get(position).getTitle());
((MyHolder)holder).content_txt.setText(mList.get(position).getContent());
}
@Override
public int getItemCount() {
if(mList == null || mList.isEmpty())
return 0;
else
return mList.size();
}
}
定义完Holder和Adapter之后,选择一种LayoutManager,给RecycleView设置adapter即可。
recycle_card = (RecyclerView) findViewById(R.id.recycle_card);
// 添加内容
List<CardModel> list = new ArrayList<>();
for(int i=0;i<10;i++) {
list.add(new CardModel("title" + i, "content" + i));
}
myAdapter = new MyAdapter(this, list);
// recycleView布局管理
linearLayoutManager = new LinearLayoutManager(this);
recycle_card.setLayoutManager(linearLayoutManager);
recycle_card.setAdapter(myAdapter);
下面是RecycleView的Item的布局 card_item_layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="10dp"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title"/>
<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/content"/>
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
第一次写,自己也觉得很不详细,慢慢改善。