关于RecyclerView的详细创建步骤请见:http://blog.youkuaiyun.com/lixiang_y/article/details/61937111
在这里我就不过多的赘述了
下面我们要使用RecyclerView实现ListView和GridView的效果,完整代码及Demo
先看一下效果图:

主要逻辑代码:
RecyclerViewAdapter.java
DataBean.java
在这里我就不过多的赘述了
下面我们要使用RecyclerView实现ListView和GridView的效果,完整代码及Demo
先看一下效果图:
主要逻辑代码:
MainActivity.java
package com.zhiyuan3g.myrecycleview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.GridLayout;
import android.widget.Toast;
import com.zhiyuan3g.myrecycleview.adapter.RecyclerViewAdapter;
import com.zhiyuan3g.myrecycleview.adapter.RecyclerViewGridAdapter;
import com.zhiyuan3g.myrecycleview.bean.DataBean;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//下面代码是菜单,方便效果展示,与recyclerView无关
//加载一个菜单的布局
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//加载布局,使用菜单特有方法getMenInfater,或Inflate对象
//参数:1.菜单显示的布局 2.固定menu
getMenuInflater().inflate(R.menu.menu_main,menu);
return true;
}
//在每个if条件下填充相应的操作代码
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
if (itemId == R.id.action_list_normal) {
//标准显示
loadListData(false,false,"List");
Toast.makeText(getApplicationContext(), "标准显示", Toast.LENGTH_SHORT).show();
return true;
} else if (itemId == R.id.action_list_vertical_reverse) {
//list:垂直反向显示
loadListData(true,false,"List");
} else if (itemId == R.id.action_list_horizontal) {
//水平显示
loadListData(false,true,"List");
} else if (itemId == R.id.action_list_horizontal_reverse) {
//水平反向显示
loadListData(true,true,"List");
} else if (itemId == R.id.gridview_normal) {
//gridview:标准显示
loadListData(false,false,"GridView");
} else if (itemId == R.id.gridview_reverse) {
//垂直反向显示
loadListData(true,false,"GridView");
} else if (itemId == R.id.gridview_horizontal_normal) {
//水平标准显示
loadListData(false,true,"GridView");
} else if (itemId == R.id.gridview_horizontal_reserse) {
//水平反向显示
loadListData(true,true,"GridView");
}
return super.onOptionsItemSelected(item);
}
//封装listview的代码 添加两个参数 1.控制条目执行顺序, 2.控制条目的布局方向
private void loadListData( boolean inversion,boolean oritation,String what) {
//集合对象
ArrayList<DataBean> datas = new ArrayList<>();
//给bean类放数据,最后把封装好的数据的Bean类放到集合里
for (int x=0; x<35 ;x++){
//创建bean对象
DataBean dataBean = new DataBean();
dataBean.icon=R.mipmap.ic_launcher;
dataBean.name="CCTV"+x;
//把bean类放入集合
datas.add(dataBean);
}
if (what.equals("List")) {
//创建适配器adapter
RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(this,datas);
//设置适配器
recyclerview.setAdapter(recyclerViewAdapter);
//布局管理器所需参数,上下文
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
//设置布局管理器
recyclerview.setLayoutManager(linearLayoutManager);
//通过布局管理器,可以控制条目排列的顺序, true为反向显示 false为正常显示
linearLayoutManager.setReverseLayout(inversion);
//通过布局管理器设置orientation,可以设置为水平和垂直
//添加三元运算符,当true时执行左边的,false时执行右边的,问题与结果之间是用?连接,
//结果与结果之间是用 :连接
linearLayoutManager.setOrientation(oritation ?LinearLayoutManager.HORIZONTAL:LinearLayoutManager.VERTICAL);
} else if (what.equals("GridView")) {
RecyclerViewGridAdapter recyclerViewGridAdapter = new RecyclerViewGridAdapter(this, datas);
recyclerview.setAdapter(recyclerViewGridAdapter);
//GridLayoutManager参数:1.上下文, 2.显示的列数(column)
GridLayoutManager gridLayoutManager = new GridLayoutManager(this,3);
recyclerview.setLayoutManager(gridLayoutManager);
gridLayoutManager.setReverseLayout(inversion);
gridLayoutManager.setOrientation(oritation? GridLayout.HORIZONTAL:GridLayout.VERTICAL);
}
}
private void initView() {
recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
}
}
RecyclerViewAdapter.java
package com.zhiyuan3g.myrecycleview.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.zhiyuan3g.myrecycleview.R;
import com.zhiyuan3g.myrecycleview.bean.DataBean;
import java.util.List;
//RecyclerView的适配器,注意要指定泛型,
// 一般我们就是类名的ViewHolder继承ViewHolder(内部已经实现了复用优化机制)
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ListViewHolder> {
private Context context;
private List<DataBean> databean;
//构造方法,一般需要接受两个参数,上下文,集合对象(包含我们的数据)
public RecyclerViewAdapter(Context context, List<DataBean> databean) {
this.context = context;
this.databean = databean;
}
//创建ViewHolder(相当于item),并把ViewHolder返回出去。
@Override
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//转换一个view布局对象,决定item的样子,参数:1.上下文 2.XML布局资源 3.为null
View view = View.inflate(context, R.layout.item_list, null);
//创建一个ViewHolder对象
ListViewHolder listViewHolder = new ListViewHolder(view);
//把创建出来的ViewHolder对象传出去
return listViewHolder;
}
//当ViewHolder和数据绑定时,回调
@Override
public void onBindViewHolder(ListViewHolder holder, int position) {
//从集合里拿对应item的数据对象
DataBean dataBean = databean.get(position);
//给holder里面的控件对象设置数据
holder.setData(dataBean);
}
//决定RecyclerView有多少条
@Override
public int getItemCount() {
//数据不为null,有几条数据就显示几条数据 ???
if (databean != null&& databean.size()>0) {
return databean.size();
}
return 0;
}
//自动帮我们写的ViewHolder,参数:view对象
public class ListViewHolder extends RecyclerView.ViewHolder {
private final ImageView mIvicon;
private final TextView mTvname;
public ListViewHolder(View itemView) {
super(itemView);
mIvicon = (ImageView)itemView.findViewById(R.id.item_list_iv_icon);
mTvname = (TextView) itemView.findViewById(R.id.item_list_tv_name);
}
public void setData(DataBean dataBean) {
//给imageview设置图片数据
mIvicon.setImageResource(dataBean.icon);
//给TextView设置文本数据
mTvname.setText(dataBean.name);
}
}
}
RecyclerViewGridAdapter.java
package com.zhiyuan3g.myrecycleview.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.zhiyuan3g.myrecycleview.R;
import com.zhiyuan3g.myrecycleview.bean.DataBean;
import java.util.ArrayList;
//提示:RecyclerViewGridAdapter和RecyclerViewListAdapter代码一样,就是改了一下item加载显示的布局
//RecyclerView的适配器,要指定泛型,一般我们就是列类名的ViewHolder继承ViewHolder(内部已经实现了复用机制)
public class RecyclerViewGridAdapter extends RecyclerView.Adapter<RecyclerViewGridAdapter.ViewHolder> {
private Context context;
private ArrayList<DataBean> datas;
public RecyclerViewGridAdapter(Context context, ArrayList<DataBean> datas) {
this.context = context;
this.datas = datas;
}
@Override
public RecyclerViewGridAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//转换一个布局为view对象
View view = View.inflate(context, R.layout.grid_item, null);
//创建ViewHolder对象,传入view对象
ViewHolder viewHolder = new ViewHolder(view);
//返回viewholder对象
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerViewGridAdapter.ViewHolder holder, int position) {
DataBean dataBean = datas.get(position);
holder.setData(dataBean);
}
@Override
public int getItemCount() {
return datas.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private final ImageView mIcon;
private final TextView mDescribe;
public ViewHolder(View itemView) {
super(itemView);
mIcon = (ImageView) itemView.findViewById(R.id.icon_img);
mDescribe = (TextView) itemView.findViewById(R.id.describe_tv);
}
public void setData(DataBean dataBean) {
mIcon.setImageResource(dataBean.icon);
mDescribe.setText(dataBean.name);
}
}
}
DataBean.java
package com.zhiyuan3g.myrecycleview.bean;
/**
*
* Author:
* Function: Bean类的下的变量类型是根据需要哪些数据来决定
*/
public class DataBean {
public int icon;
public String name;
}
完整Demo代码下载:http://pan.baidu.com/s/1gfMcQKN