自从 Android 5.0 以后,google 推出了一个 RecyclerView 控件,他是 support-v7 包中的新组件,是一个强大的滑动组件,与经典的 ListView 相比,一样拥有item回收复用的功能, RecyclerView 至关因而 ListView 的升级版。java
RecyclerView 封装了 ViewHolder 的回收复用,也就是说 RecyclerView 标准化了 ViewHolder ,编写 Adapter 面向的是 ViewHolder 而不是 View 了,复用的逻辑被封装了,写起来更加简单。android
RecyclerView 提供一种插拔式的体验,高度的解耦,异常的灵活,针对一个 Item 的显示 RecyclerView 专门抽取了相应的类,来控制 Item 的显示,使其的扩展性特别强。web
compile 'com.android.support:recyclerview-v7:25.1.0'
/*activity_main.xml*/
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.manu.mrecyclerview.MainActivity">
<android.support.v7.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
/*item.xml*/
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dp">
<TextView android:id="@+id/tv_recycle" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:text="data" android:background="#cac3c3" android:padding="10dp" android:textSize="20sp"/>
</LinearLayout>
RecyclerView的Adapter要比ListView的Adapter设置起来稍微复杂一点,这也是RecyclerView高度解耦的体现,虽然代码复杂一点,但扩展性很好,下面介绍一下实现RecyclerView的Adapter的三个方法:bash
该方法主要是为每一个Item加载一个View,可是该方法返回的是一个ViewHolder,该方法吧View直接封装的ViewHolder中,而后咱们面向的是ViewHolder这个实例,这个ViewHolder也由本身编写,但不用像ListView调用convertView.setTag(vh)和convertView.getTag()了。dom
该方法主要用来把数据绑定在View上,直接提供一个ViewHolder而不是convertView。ide
该方法返回选项总数。svg
/** * Created by jzman on 2017/5/13 0013. */
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.DataViewHolder>{
private Context mContext;
private ArrayList<String> mList;
public RvAdapter() {}
public RvAdapter(Context mContext, ArrayList<String> mList) {
this.mContext = mContext;
this.mList = mList;
}
//用于建立ViewHolder
@Override
public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item,null);
//使用代码设置宽高(xml布局设置无效时)
view.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
DataViewHolder holder = new DataViewHolder(view);
return holder;
}
//绑定数据
@Override
public void onBindViewHolder(DataViewHolder holder, int position) {
holder.tv_data.setText(mList.get(position));
}
//数据总数
@Override
public int getItemCount() {
return mList.size();
}
//建立ViewHolder
public static class DataViewHolder extends RecyclerView.ViewHolder{
TextView tv_data;
public DataViewHolder(View itemView) {
super(itemView);
tv_data = (TextView) itemView.findViewById(R.id.tv_recycle);
}
}
使用StaggeredGridLayoutManager管理器时,Adapter参考以下:布局
/** * Created by jzman on 2017/5/13 0013. * RecycleView的Adapter */
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.DataViewHolder>{
private Context mContext;
private RecyclerView recyclerView;
private ArrayList<String> mList;
private ArrayList<Integer> mHeight;
public RvAdapter() {}
public RvAdapter(Context mContext, ArrayList<String> mList) {
this.mContext = mContext;
this.mList = mList;
}
/** * 初始化每一个Item的高度(瀑布流效果) * @return */
public ArrayList<Integer> initHeight(){
mHeight = new ArrayList<>();
for (int i=0;i<mList.size();i++){
mHeight.add((int) (Math.random()*300)+200);
}
return mHeight;
}
/** * 用于建立ViewHolder * @param parent * @param viewType * @return */
@Override
public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item,null);
//使用代码设置宽高(xml布局设置无效时)
view.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
DataViewHolder holder = new DataViewHolder(view);
return holder;
}
/** * 绑定数据 * @param holder * @param position */
@Override
public void onBindViewHolder(DataViewHolder holder, int position) {
//设置每一个Item的高度
ViewGroup.LayoutParams h = holder.tv_data.getLayoutParams();
h.height = mHeight.get(position);
holder.tv_data.setText(mList.get(position));
}
/** * 选项总数 * @return */
@Override
public int getItemCount() {
return mList.size();
}
/** * 建立ViewHolder */
public static class DataViewHolder extends RecyclerView.ViewHolder{
TextView tv_data;
public DataViewHolder(View itemView) {
super(itemView);
tv_data = (TextView) itemView.findViewById(R.id.tv_recycle);
}
}
/** * 将RecycleView附加到Adapter上 */
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
this.recyclerView= recyclerView;
//初始化每一个Item的高度
initHeight();
}
/** * 将RecycleView从Adapter解除 */
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
this.recyclerView = null;
}
}
/** * Created by jzman on 2017/5/13 0013. */
public class MainActivity extends AppCompatActivity {
private RecyclerView rv;
RvAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv = (RecyclerView) findViewById(R.id.rv);
//设置布局管理器
rv.setLayoutManager(new LinearLayoutManager(this));//线性
// rv.setLayoutManager(new GridLayoutManager(this,4));//线性
// rv.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//线性
adapter = new RvAdapter(this,initData());
rv.setAdapter(adapter);
}
public static ArrayList<String> initData(){
ArrayList<String> arrayList = new ArrayList<>();
for (int i=0;i<50;i++){
arrayList.add("第"+i+"条数据");
}
return arrayList;
}
}
LinearLayoutManager | GridLayoutManager | StaggeredGridLayoutManager |
---|---|---|
![]() |
![]() |
![]() |
<完>this