RecyclerView详解
这可能是RecyclerView最简单的入门程序了,本篇文章只适合Recycle入门,请轻喷
RecycleView介绍
RecycleView可以用来替代ListView以及GridView可以自定义炫酷的效果。在使用RecycleView的过程中需要了解一下四点
- LayoutManager布局管理器控制每一个item的布局方式
- ItemAnimator每一个Item增加与删除的动画效果
- ItemDecoration Item之间的间隔控制
- item点击事件,自己写,莫名喜感,哈哈哈哈哈
如果没有耐心,请直接下载代码,没有代码的教程都是耍流氓!!!
入门阶段
在工程中引入RecycleView
implementation 'com.android.support:recyclerview-v7:27.1.0'
在MainActivity布局文件main_activity中引入 RecyclerView
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/main_activity_recycleview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>
新建Adapter将要加载的布局文件item_recycle_view
<?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:orientation="horizontal"
android:layout_margin="10dp"
>
<ImageView
android:id="@+id/item_pic_iv"
android:layout_width="120dp"
android:layout_height="100dp"
android:background="@mipmap/scene1"
/>
<TextView
android:id="@+id/item_name_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="right"
android:layout_weight="1"
android:text="点击"
/>
</LinearLayout>
新建RecycleViewAdapter
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{
private int[] pics;
private String[] names;
public RecyclerViewAdapter(int[] pics,String[] names){
this.pics=pics;
this.names=names;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//使用此方法将不能适配父组件的布局
// View view=View.inflate(parent.getContext(),R.layout.item_recycle_view,null);
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycle_view,parent,false);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
//用于绑定数据
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.imageView.setBackgroundResource(pics[position]);
holder.textView.setText(names[position]);
}
//返回的item总数
@Override
public int getItemCount() {
return pics.length;
}
public static class ViewHolder extends RecyclerView.ViewHolder{
private ImageView imageView;
private TextView textView;
public ViewHolder(View itemView) {
super(itemView);
imageView=(ImageView)itemView.findViewById(R.id.item_pic_iv);
textView=(TextView)itemView.findViewById(R.id.item_name_tv);
}
}
}
在MainActivity中加载RecycleView布局
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerViewAdapter recycleViewAdapter;
private int[] pics;
private String[] names;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initData(){
pics=new int[]{R.mipmap.scene1,R.mipmap.scene01,R.mipmap.scene02,R.mipmap.scene03,R.mipmap.scene04};
names=new String[]{"景点1","景点2","景点3","景点4","景点5"};
}
private void initView(){
initData();
recyclerView=(RecyclerView)findViewById(R.id.main_activity_recycleview);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recycleViewAdapter=new RecyclerViewAdapter(pics,names);
recyclerView.setAdapter(recycleViewAdapter);
}
}
运行结果:假装这里有图片
Demo地址
为Item添加点击事件阶段
因为RecyclerView自身没有点击事件的方法,因此需要自己编写点击事件。通过在Adapter中设置点击监听,并将接口暴露出来来实现。
基于以上的步骤,只需要修改RecyclerViewAdapter以及MainActivity中的代码即可
RecyclerViewAdapter中为每一个Item添加点击事件,同时将需要的点击事件的接口暴露给外部调用,直接贴代码
修改RecyclerAdapter中的代码
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{
private int[] pics;
private String[] names;
public OnItemClickListener onItemClickListener;
public RecyclerViewAdapter(int[] pics,String[] names){
this.pics=pics;
this.names=names;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//使用此方法将不能适配父组件的布局
// View view=View.inflate(parent.getContext(),R.layout.item_recycle_view,null);
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycle_view,parent,false);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
//用于绑定数据
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
holder.imageView.setBackgroundResource(pics[position]);
holder.textView.setText(names[position]);
//为整个item添加点击事件
// holder.itemView.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// onItemClickListener.OnItemClickListener(position,names);
// }
// });
//只为item中的某一个元素添加点击事件
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.OnItemClickListener(position,names);
}
});
}
//返回的item总数
@Override
public int getItemCount() {
return pics.length;
}
public static class ViewHolder extends RecyclerView.ViewHolder{
private ImageView imageView;
private TextView textView;
public ViewHolder(View itemView) {
super(itemView);
imageView=(ImageView)itemView.findViewById(R.id.item_pic_iv);
textView=(TextView)itemView.findViewById(R.id.item_name_tv);
}
}
/**
* 当item被点击的时进行回调
* */
public interface OnItemClickListener{
void OnItemClickListener(int pos,String[] names);
}
/**
* 用于将每一次点击事件暴露到外面
* */
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener=onItemClickListener;
}
}
修改MainActivity中的代码
public class MainActivity extends AppCompatActivity implements RecyclerViewAdapter.OnItemClickListener{
private RecyclerView recyclerView;
private RecyclerViewAdapter recycleViewAdapter;
private int[] pics;
private String[] names;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initData(){
pics=new int[]{R.mipmap.scene1,R.mipmap.scene01,R.mipmap.scene02,R.mipmap.scene03,R.mipmap.scene04};
names=new String[]{"景点1","景点2","景点3","景点4","景点5"};
}
private void initView(){
initData();
recyclerView=(RecyclerView)findViewById(R.id.main_activity_recycleview);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//网格布局
//recyclerView.setLayoutManager(new GridLayoutManager(this,2));
recycleViewAdapter=new RecyclerViewAdapter(pics,names);
recycleViewAdapter.setOnItemClickListener(this);
recyclerView.setAdapter(recycleViewAdapter);
}
@Override
public void OnItemClickListener(int pos, String[] names) {
Toast.makeText(this,names[pos],Toast.LENGTH_LONG).show();
}
}