Android中由于ListView和GridView功能的不健全,特别是列表缓存设置问题是由我们自己去设置的,因此谷歌又添加了一个组件 RecyclerView,这个组件非常强悍,可以同时实现列表和表格横纵向排序,还有瀑布流的展现,但是有个缺点就是没有提供点击事件给我们,案例会给出,还有值得注意的是它放在 v7 包中,因此使用之前记得引入相关类库;话不多说,开搞:
一、添加 v7 包中所依赖的 RecyclerView 组件
右键 app 点后选择 “Open Module Settings”,然后 "Dependencies",接下来 “Library dependency”,然后选择组件即可:
这里需要注意的是,组件版本必须要和我们环境的配置版本一样,如图:
二、在布局文件中添加我们的组件:
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
三、声明相应的组件及集合数据对象之后设置窗体源代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView(); // 初始化组件
initData(); // 初始化数据
setData(); // 适配器绑定数据
setRvTypeAndListener(); //设置类型组件及监听事件
}
四、前三个方法的实现如下:
//初始化方法
private void initView() {
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
}
//初始化数据的方法
private void initData() {
datas = new ArrayList<>();
//准备数据
for(int i = 0; i < 100; i++){
datas.add("Content_"+ i);
}
}
//设置适配器
private void setData() {
//设置适配器
adapter = new MyRecyclerViewAdapter(this, datas);
recyclerView.setAdapter(adapter);
}
五、创建一个名为 MyRecyclerViewAdapter 并且使其 继承自 RecyclerView 自身的适配器(注意:这里适配器泛型是存放 自定义内部类的组件容器):
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private Context mContext;
private List<String> datas;
public MyRecyclerViewAdapter(Context mContext, List<String> datas) {
this.mContext = mContext;
this.datas = datas;
}
//相当于 getView 方法中创建 View 和 ViewHolder
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = View.inflate(mContext, R.layout.item_recyclerview, null);
return new MyViewHolder(itemView);
}
//数据 和 View绑定 ,相当于 getView 绑定数据部分的代码
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
//根据位置得到对应的数据
String data = datas.get(position);
holder.tv_title.setText(data);
}
//得到总条数
@Override
public int getItemCount() {
return datas.size();
}
//内部组件容器类
class MyViewHolder extends RecyclerView.ViewHolder {
public MyViewHolder(View itemView) {
super(itemView);
}
}
}
六、创建出 item_recyclerview.xml 选项文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:padding="5dp"
android:background="#fff">
<LinearLayout
android:padding="5dp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="#22000000">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"/>
<TextView
android:id="@+id/tv_title"
android:layout_marginLeft="30dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Content"
android:textAllCaps="false"
android:textColor="#000000"/>
</LinearLayout>
</RelativeLayout>
七、将内部容器类修改如下:
class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView iv_icon;
private TextView tv_title;
public MyViewHolder(View itemView) {
super(itemView);
iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);
tv_title = (TextView) itemView.findViewById(R.id.tv_title);
}
}
八、接下来我们实现 setRvTypeAndListener() 方法 <如不设置此方法中的代码则组件无法显示数据>:
//设置组件的样式
private void setRvTypeAndListener() {
//LayoutManager 设置样式组件
//设置成 列表
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true)); //上下文、方向、是否倒序
//recyclerView.scrollToPosition(datas.size()-1); //指定显示的位置
//设置成表格
//recyclerView.setLayoutManager(new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false)); //上下文、列数、方向、是否倒序
//recyclerView.scrollToPosition(datas.size()-1);
//设置成瀑布流
//recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); // 列数、方向
}
运行效果图如下(注:可自行修改显示格式):
九、由于 RecyclerView 不想 ListView 和 GridView 那样有自带的点击事件,因此点击事件必须要由我们自己去设置,我们直接在 MyViewHolder 构造方法中为 选项对象设置点击事件即可:
public MyViewHolder(View itemView){
super(itemView);
iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);
tv_title = (TextView) itemView.findViewById(R.id.tv_title);
//添加点击事件
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "当前点击 "+ datas.get(getLayoutPosition()), Toast.LENGTH_SHORT).show();
}
});
}
我们运行程序效果如下:
十、当然,如果觉得在适配器里设置比较麻烦不够灵活的话即我们想使用 适配器对象 设置,那如何实现呢?很简单,我们在适配器里定义接口,然后回调出去即可实现我们的点击事件,在适配器里 创建内部的 接口及 回调方法 :
//点击 RecyclerView 某条的监听
public interface OnItemClickListener{
/**
* 当RecyclerView某个被点击的时候回调
* @param view 点击item的视图
* @param data 点击得到的数据
*/
void onItemClick(View view, String data);
}
private OnItemClickListener onItemClickListener;
/**
* 设置RecyclerView某个的监听
* @param onItemClickListener
*/
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener = onItemClickListener;
}
十一、定义好之后,我们将选项对象的点击事件修改如下:
//添加点击事件
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(mContext, "当前点击 "+ datas.get(getLayoutPosition()), Toast.LENGTH_SHORT).show();
if(onItemClickListener != null){
onItemClickListener.onItemClick(v, datas.get(getLayoutPosition()));
}
}
});
十二、然后返回源文件并将 setRvTypeAndListener() 方法做如下修改即可:
//设置组件的样式
private void setRvTypeAndListener() {
//LayoutManager 设置样式组件
//设置成 列表
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true)); //上下文、方向、是否倒序
//recyclerView.scrollToPosition(datas.size()-1);
//设置成表格
//recyclerView.setLayoutManager(new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false)); //上下文、列数、方向、是否倒序
//recyclerView.scrollToPosition(datas.size()-1);
//设置成瀑布流
// recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); // 列数、方向
adapter.setOnItemClickListener(new MyRecyclerViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, String data) {
Toast.makeText(MainActivity.this, "点击-> "+ data, Toast.LENGTH_SHORT).show();
}
});
}
运行效果如下:
值得注意的是:如果我们给选项添加长按事件或者为某个组件添加点击事件而已的话,其做法和刚刚刚设置的 点击事件 一个原理,在适配器中做相应的设置即可....
好了,这个案例就写到这里,顺便附上源码 - >
链接:https://pan.baidu.com/s/1rwaoesCMprS36qz9NNZxnQ 密码:pti7
有疑问可随时留言哦!!!嘿嘿。。。