RecyclerView隶属于v7包下的一员大将,是谷歌为开发人员准备的一个功能强大的控件,他不仅可以拥有listview和gridview那样集成数据集,还有着设置水平、垂直、正反向显示和实现瀑布流的效果,你只需要了解一下就可以完全替代那两个老家伙了。
先写在你的布局文件中:
<android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView>1.类似listview的展示:
//初始化view mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
适配器://类似listview的展示 private void loadListData(boolean reverse, boolean vertical) { //数据初始化 List<DataBean> datas = new ArrayList<>(); for (int i = 0; i < DATAS.ICONS.length; i++) { DataBean bean = new DataBean(); bean.icon = DATAS.ICONS[i]; bean.name = "图片-" + i; datas.add(bean); } //给RecyclerView加载数据 //1. 设置布局管理器 LinearLayoutManager layoutManager = new LinearLayoutManager(this); //设置是否反向显示 layoutManager.setReverseLayout(reverse); //设置显示的方向 layoutManager.setOrientation(vertical ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL); mRecyclerView.setLayoutManager(layoutManager); //2. 设置适配器 mRecyclerView.setAdapter(new ListAdapter(this, datas)); }
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListViewHolder>//标准的写法是本类名下的XXViewHolder extends RecyclerView.ViewHolder(即创建一个内部类继承RecyclerView.ViewHolder) { private Context mContext; private List<DataBean> mDatas;//数据是由holder内的数据来决定的,所以要封装一个javabean作为容器 //构造函数传入上下文和数据 public ListAdapter(Context context, List<DataBean> datas) { this.mContext = context; this.mDatas = datas; } //一个条目就是一个holder,当holder而被创建的时候此方法被调用 @Override public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //当viewholder创建时的回调 View view = View.inflate(mContext, R.layout.item_list, null); return new ListViewHolder(view); } @Override public void onBindViewHolder(ListViewHolder holder, int position) { //当viewholder和数据绑定时的回调 //需要有数据 DataBean bean = mDatas.get(position); holder.setData(bean); } @Override public int getItemCount() { //返回的是list数据个数 if (mDatas != null) { return mDatas.size(); } return 0; } //子布局中的viewid在这里实现 public class ListViewHolder extends RecyclerView.ViewHolder { private ImageView ivIcon; private TextView tvName; public ListViewHolder(View itemView) { super(itemView); ivIcon = (ImageView) itemView.findViewById(R.id.item_list_iv_icon); tvName = (TextView) itemView.findViewById(R.id.item_list_tv_name); } public void setData(DataBean bean) { //设置数据的方法 ivIcon.setImageResource(bean.icon); tvName.setText(bean.name); } } }
2.类似gridview的展示:
//类似gridview的展示 private void loadGridData(boolean reverse, boolean vertical) { List<DataBean> datas = new ArrayList<>(); for (int i = 0; i < DATAS.ICONS.length; i++) { DataBean bean = new DataBean(); bean.icon = DATAS.ICONS[i]; bean.name = "图片-" + i; datas.add(bean); } //1.布局管理器 GridLayoutManager layoutManager = new GridLayoutManager(this, 2); //设置是否反向显示 layoutManager.setReverseLayout(reverse); //设置显示的方向 layoutManager.setOrientation(vertical ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL); mRecyclerView.setLayoutManager(layoutManager); //2.设置adapter mRecyclerView.setAdapter(new GridAdapter(this, datas)); }适配器:
public class GridAdapter extends RecyclerView.Adapter<GridAdapter.GridViewHolder> { private Context mContext; private List<DataBean> mDatas; public GridAdapter(Context context, List<DataBean> datas) { this.mContext = context; this.mDatas = datas; } @Override public GridViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //当viewholder创建时的回调 View view = View.inflate(mContext, R.layout.item_grid, null); return new GridViewHolder(view); } @Override public void onBindViewHolder(GridViewHolder holder, int position) { //当viewholder和数据绑定时的回调 //需要有数据 DataBean bean = mDatas.get(position); holder.setData(bean); } @Override public int getItemCount() { //返回的是list数据个数 if (mDatas != null) { return mDatas.size(); } return 0; } public class GridViewHolder extends RecyclerView.ViewHolder { private ImageView ivIcon; private TextView tvName; public GridViewHolder(View itemView) { super(itemView); ivIcon = (ImageView) itemView.findViewById(R.id.item_list_iv_icon); tvName = (TextView) itemView.findViewById(R.id.item_list_tv_name); } public void setData(DataBean bean) { //设置数据的方法 ivIcon.setImageResource(bean.icon); tvName.setText(bean.name); } } }3.瀑布流展示
private void loadStaggeredData(boolean reverse, boolean vertical) { List<DataBean> datas = new ArrayList<>(); for (int i = 0; i < DATAS.PICS.length; i++) { DataBean bean = new DataBean(); bean.icon = DATAS.PICS[i]; bean.name = "图片-" + i; datas.add(bean); } //1.设置layoutmanager StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, vertical ? StaggeredGridLayoutManager.VERTICAL : StaggeredGridLayoutManager.HORIZONTAL); layoutManager.setReverseLayout(reverse); mRecyclerView.setLayoutManager(layoutManager); // 2.设置adapter mRecyclerView.setAdapter(new StaggeredAdapter(this, datas)); }适配器:
public class StaggeredAdapter extends RecyclerView.Adapter<StaggeredAdapter.StaggeredViewHolder> { private Context mContext; private List<DataBean> mDatas; public StaggeredAdapter(Context context, List<DataBean> datas) { this.mContext = context; this.mDatas = datas; } @Override public StaggeredViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //当viewholder创建时的回调 View view = View.inflate(mContext, R.layout.item_staggered, null); return new StaggeredViewHolder(view); } @Override public void onBindViewHolder(StaggeredViewHolder holder, int position) { //当viewholder和数据绑定时的回调 //需要有数据 DataBean bean = mDatas.get(position); holder.setData(bean); } @Override public int getItemCount() { //返回的是list数据个数 if (mDatas != null) { return mDatas.size(); } return 0; } public class StaggeredViewHolder extends RecyclerView.ViewHolder { private ImageView ivIcon; private TextView tvName; public StaggeredViewHolder(View itemView) { super(itemView); ivIcon = (ImageView) itemView.findViewById(R.id.item_list_iv_icon); tvName = (TextView) itemView.findViewById(R.id.item_list_tv_name); } public void setData(DataBean bean) { //设置数据的方法 ivIcon.setImageResource(bean.icon); tvName.setText(bean.name); } } }源码下载