1.RecycleView简介
RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比ListView更好。
RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集。RecyclerView用以下两种方式简化了数据的展示和处理:
1.使用LayoutManager来确定每一个item的排列方式。
2.为增加和删除项目提供默认的动画效果。
你也可以定义你自己的LayoutManager和添加删除动画,RecyclerView项目结构如下:
Adapter:使用RecyclerView之前,你需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。
LayoutManager:用来确定每一个item如何进行排列摆放,何时展示和隐藏。回收或重用一个View的时候,LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的View和频繁的调用findViewById方法(与ListView原理类似)。
代码
1.配置Gradle
//RecyclerView
implementation 'com.android.support:recyclerview-v7:28.0.0'
2.Item布局
3.布局
4.Adapter
package com.wjn.viewlistdemo.activity.recyclerview;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.wjn.viewlistdemo.R;
import java.util.List;
public class MyRecycleViewAdapter extends RecyclerView.Adapter{
private Context context;
private List list;
private LayoutInflater mInflater;
private RecycleViewAdapterInterface recycleViewAdapterInterface=null;
public void setRecycleViewItemClickAndLongClick(RecycleViewAdapterInterface recycleViewAdapterInterface){
this.recycleViewAdapterInterface=recycleViewAdapterInterface;
}
public MyRecycleViewAdapter(Context context, List list){
this.context=context;
this.list=list;
mInflater = LayoutInflater.from(context);
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view=mInflater.inflate(R.layout.recyclerview_item, viewGroup, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
viewHolder.textView1.setText(list.get(i).getName() + "【" + (i + 1) + "】");
viewHolder.textView2.setText(list.get(i).getDescribe());
viewHolder.circleImageView.setBackgroundResource(R.mipmap.patient_ava);
/**
* 捕获RecycleView的Item点击以及长按事件
* */
final int clickposition=i;
//Item点击
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(null!=recycleViewAdapterInterface){
recycleViewAdapterInterface.OnItemCilck(v,clickposition);
}
}
});
//Item长按
viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if(null!=recycleViewAdapterInterface){
recycleViewAdapterInterface.OnItemLongCilck(v,clickposition);
}
return true;
}
});
}
/**
* ViewHolder类
* */
class ViewHolder extends RecyclerView.ViewHolder{
private ImageView circleImageView;
private TextView textView1;
private TextView textView2;
public ViewHolder(View itemView) {
super(itemView);
circleImageView = itemView.findViewById(R.id.recycleview_circleimageview);
textView1 = itemView.findViewById(R.id.recycleview_item_textview1);
textView2 = itemView.findViewById(R.id.recycleview_item_textview2);
}
}
/**
* 添加数据
* */
public void addData(Student student,int position) {
list.add(position, student);
notifyItemInserted(position);
notifyItemRangeChanged(position,list.size());
}
/**
* 删除数据
* */
public void removeData(int position) {
list.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position,list.size());
}
}
5.接口
package com.wjn.viewlistdemo.activity.recyclerview;
import android.view.View;
public interface RecycleViewAdapterInterface {
void OnItemCilck(View view, int position);
void OnItemLongCilck(View view, int position);
}
6.Activity
package com.wjn.viewlistdemo.activity.recyclerview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import com.wjn.viewlistdemo.R;
import com.wjn.viewlistdemo.utils.StatusBarUtil;
import java.util.ArrayList;
import java.util.List;
import static android.support.v7.widget.RecyclerView.SCROLL_STATE_DRAGGING;
import static android.support.v7.widget.RecyclerView.SCROLL_STATE_IDLE;
import static android.support.v7.widget.RecyclerView.SCROLL_STATE_SETTLING;
public class RecyclerViewActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MyRecycleViewAdapter adapter;
private List list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recyclerview);
//根据状态栏颜色来决定 状态栏背景 用黑色还是白色 true:是否修改状态栏字体颜色
StatusBarUtil.setStatusBarMode(this, false, false, R.color.colorPrimary);
initView();
}
/**
* 初始化各种View
* */
private void initView(){
recyclerView=findViewById(R.id.activity_recyclerview_recycleview);
list = new ArrayList<>();
Student student1 = new Student();
student1.setName("詹姆斯");
student1.setDescribe(student1.getName() + ":很懒什么也没留下!");
Student student2 = new Student();
student2.setName("韦德");
student2.setDescribe(student2.getName() + ":很懒什么也没留下!");
Student student3 = new Student();
student3.setName("山东鲁能");
student3.setDescribe(student3.getName() + ":很懒什么也没留下!");
Student student4 = new Student();
student4.setName("保罗");
student4.setDescribe(student4.getName() + ":很懒什么也没留下!");
Student student5 = new Student();
student5.setName("安东尼");
student5.setDescribe(student5.getName() + ":很懒什么也没留下!");
Student student6 = new Student();
student6.setName("蒿俊闵");
student6.setDescribe(student6.getName() + ":很懒什么也没留下!");
Student student7 = new Student();
student7.setName("李霄鹏");
student7.setDescribe(student7.getName() + ":很懒什么也没留下!");
for (int i = 0; i < 30; i++) {
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student4);
list.add(student5);
list.add(student6);
list.add(student7);
}
//2.设置LinearLayoutManager ListView
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//3.设置ItemAnimator
recyclerView.setItemAnimator(new DefaultItemAnimator());
//4.设置固定大小
recyclerView.setHasFixedSize(true);
adapter = new MyRecycleViewAdapter(this, list);
recyclerView.setAdapter(adapter);
/**
* RecycleView滚动监听
* */
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
switch (newState) {
case SCROLL_STATE_SETTLING://滚动
break;
case SCROLL_STATE_DRAGGING://拖动
break;
case SCROLL_STATE_IDLE://空闲
break;
default://其他
break;
}
adapter.notifyDataSetChanged();
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
/**
* Item点击以及长按监听
* */
if (null != adapter) {
adapter.setRecycleViewItemClickAndLongClick(new RecycleViewAdapterInterface() {
@Override
public void OnItemCilck(View view, int position) {
if (null != list) {
String name = list.get(position).getName();
Toast.makeText(RecyclerViewActivity.this, "点击:" + name, Toast.LENGTH_SHORT).show();
}
}
@Override
public void OnItemLongCilck(View view, int position) {
if (null != list) {
String name = list.get(position).getName();
Toast.makeText(RecyclerViewActivity.this, "长按:" + name, Toast.LENGTH_SHORT).show();
}
}
});
}
}
}
7.说明
7.1.RecycleView所在包android.support.v7.widget.RecyclerView。
7.2.和ListView直接继承BaseAdapter不同。RecycleView的适配器
继承RecyclerView.Adapter
onCreateViewHolder方法:引入Item布局。
onBindViewHolder方法:获取数值。
getItemCount方法:获取列表Item条数。
7.3.与ListView不同,RecycleView没有直接提供Item点击以及Item长按事件。需要自己写。
自定义接口
package com.wjn.viewlistdemo.activity.recyclerview;
import android.view.View;
public interface RecycleViewAdapterInterface {
void OnItemCilck(View view, int position);
void OnItemLongCilck(View view, int position);
}
Adapter中初始化以及暴露外部调用方法
暴露外部调用
private RecycleViewAdapterInterface recycleViewAdapterInterface=null;
public void setRecycleViewItemClickAndLongClick(RecycleViewAdapterInterface recycleViewAdapterInterface){
this.recycleViewAdapterInterface=recycleViewAdapterInterface;
}
初始化
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
viewHolder.textView1.setText(list.get(i).getName() + "【" + (i + 1) + "】");
viewHolder.textView2.setText(list.get(i).getDescribe());
viewHolder.circleImageView.setBackgroundResource(R.mipmap.patient_ava);
/**
* 捕获RecycleView的Item点击以及长按事件
* */
final int clickposition=i;
//Item点击
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(null!=recycleViewAdapterInterface){
recycleViewAdapterInterface.OnItemCilck(v,clickposition);
}
}
});
//Item长按
viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if(null!=recycleViewAdapterInterface){
recycleViewAdapterInterface.OnItemLongCilck(v,clickposition);
}
return true;
}
});
}
外部调用(全局)
/**
* Item点击以及长按监听
* */
if (null != adapter) {
adapter.setRecycleViewItemClickAndLongClick(new RecycleViewAdapterInterface() {
@Override
public void OnItemCilck(View view, int position) {
if (null != list) {
String name = list.get(position).getName();
Toast.makeText(GlideRecycleViewActivity.this, "点击:" + name, Toast.LENGTH_SHORT).show();
}
}
@Override
public void OnItemLongCilck(View view, int position) {
if (null != list) {
String name = list.get(position).getName();
Toast.makeText(GlideRecycleViewActivity.this, "长按:" + name, Toast.LENGTH_SHORT).show();
}
}
});
}
7.4.删除和添加数据
RecycleView删除添加数据非常方便。
Adapter中
/**
* 添加数据
* */
public void addData(Student student,int position) {
list.add(position, student);
notifyItemInserted(position);
notifyItemRangeChanged(position,list.size());
}
/**
* 删除数据
* */
public void removeData(int position) {
list.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position,list.size());
}
7.5.RecycleView的滚动事件最好是这样添加。
recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener())
因为
recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener())
可能会出现空指针,且已过期。另外RecycleView滚动事件 状态
SCROLL_STATE_SETTLING:滚动
SCROLL_STATE_DRAGGING:拖动
SCROLL_STATE_IDLE:空闲
7.6.目前SDK中提供了三种自带的LayoutManager
LinearLayoutManager:ListView列表
GridLayoutManager:GridView列表
StaggeredGridLayoutManager:纵向列表
recyclerview.setLayoutManager(new LinearLayoutManager(this));
recyclerview.setLayoutManager(new GridLayoutManager(GlideRecycleViewActivity.this, 4));//4:GridView一行显示几个Item
recyclerview.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL));2:纵向列表一页显示几行item
7.7.可设置RecycleView的Animator(动画效果,这里以默认为例)
recyclerview.setItemAnimator(new DefaultItemAnimator());
代码链接:https://github.com/wujianning/ViewListDemo