RecyclerView
介绍
特点
- 自动复用
- 支持三种布局:网格布局+线性布局+瀑布流布局
- 支持动画
- 支持多布局
- 支持自定义分割线
方法
LinearLayoutManager:recyclerview线性管理器(垂直水平方向);
GridLayoutManager:网格布局管理器;
StaggeredGridLayoutManager:瀑布流布局管理器;
RecyclerView.setLayoutManager(LayoutManager manager):添加布局管理器
RecyclerView.addItemDecoration(ItemDecoration decoration):添加分割线
RecyclerView.setItemAnimator(ItemAnimator animator):添加动画方法
使用监听的时候,看好是条目监听,还是条目子控件监听
设置给RecycleView数据的时候,必须设置布局管理方式
使用左右布局的时候,适配器要重写 getItemViewType(int position) 方法
代码
依赖
implementation ‘com.android.support:recyclerview-v7:28.0.0’
分割线
//设置分割线
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(dividerItemDecoration);
滑动方向
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
//横向滑动
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
//垂直滑动
// linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
布局填充不拉伸
<!--centerCrop 填充不拉伸-->
android:scaleType="centerCrop"
删除动画效果
DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
defaultItemAnimator.setRemoveDuration(3000); //删除时长
recyclerView.setItemAnimator(defaultItemAnimator);
适配器代码:
package com.example.day7;
import android.content.Context;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
List<Integer> lists;
Context context;
MyListener myListener;
public void setMyAdapter(MyListener myListener) {
this.myListener = myListener;
}
LayoutInflater layoutInflater;
public MyAdapter(List<Integer> lists, Context context) {
this.lists = lists;
this.context = context;
layoutInflater=LayoutInflater.from(context);
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = layoutInflater.inflate(R.layout.layout_item, null);
return new MyViewHolder(view);
}
@Override
public int getItemCount() {
return lists.size();
}
//填充数据
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
// holder.imageView.setImageResource(lists.get(position));
Glide.with(context).load(lists.get(position)).apply(RequestOptions.bitmapTransform(new RoundedCorners(20))).into(holder.imageView);
//点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myListener.itemonclick(position);
}
});
}
//自定义viewholder类
class MyViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView=itemView.findViewById(R.id.pic);
}
}
}
MyListener:
package com.example.day7;
public interface MyListener {
void itemonclick(int position);
}
MainActivity:
package com.example.day7;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.app.StatusBarManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
MyAdapter adapter;
List<Integer> lists=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.recycleview);
adapter=new MyAdapter(lists,this);
lists.add(R.mipmap.a);
lists.add(R.mipmap.b);
lists.add(R.mipmap.c);
lists.add(R.mipmap.d);
lists.add(R.mipmap.e);
lists.add(R.mipmap.f);
lists.add(R.mipmap.g);
lists.add(R.mipmap.q);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置分割线
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(dividerItemDecoration);
//点击事件 -- 删除
adapter.setMyAdapter(new MyListener() {
@Override
public void itemonclick(int position) {
Toast.makeText(MainActivity.this, ""+position, Toast.LENGTH_SHORT).show();
lists.remove(position);
//刷新指定item
adapter.notifyItemRemoved(position); //带有动画删除效果
//重新整理集合下标 - 从0开始
adapter.notifyItemRangeChanged(0,lists.size());
}
});
//设置删除动画
DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
defaultItemAnimator.setRemoveDuration(3000); //删除时长
recyclerView.setItemAnimator(defaultItemAnimator);
}
public void click(View view) {
switch (view.getId()){
case R.id.linear:
recyclerView.setLayoutManager(new LinearLayoutManager(this));
break;
case R.id.gird:
recyclerView.setLayoutManager(new GridLayoutManager(this,2));
break;
case R.id.pubu:
//第一个参数:列
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
break;
}
}
}
QQ聊天适配器
Message类:
package com.example.day7_qq;
public class Message {
String message;
int type;
public Message(String message, int type) {
this.message = message;
this.type = type;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public Message() {
}
}
适配器:
package com.example.day7_qq;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
List<Message> lists;
Context context;
LayoutInflater layoutInflater;
public MyAdapter(List<Message> lists, Context context) {
this.lists = lists;
this.context = context;
layoutInflater=LayoutInflater.from(context);
}
//根据下标返回类型
@Override
public int getItemViewType(int position) {
return lists.get(position).getType();
}
//创建ViewHolder
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//viewType 代表type
if (viewType == 0) { // viewtype==0 加载左边
View view = layoutInflater.inflate(R.layout.layout_left, null);
return new LeftViewHolder(view);
}else if(viewType==1){// viewtype==1 加载右边
View view = layoutInflater.inflate(R.layout.layout_right, null);
return new RightViewHolder(view);
}
return null;
}
//绑定数据
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == 0) { //强转成座布局
LeftViewHolder leftViewHolder = (LeftViewHolder) holder;
leftViewHolder.left_message.setText(lists.get(position).getMessage());
} else if (getItemViewType(position) == 1) { //强转成右布局
RightViewHolder rightViewHolder = (RightViewHolder) holder;
rightViewHolder.right_message.setText(lists.get(position).getMessage());
}
}
@Override
public int getItemCount() {
return lists.size();
}
//左右viewholder
class LeftViewHolder extends RecyclerView.ViewHolder {
ImageView left_pic;
TextView left_message;
public LeftViewHolder(@NonNull View itemView) {
super(itemView);
left_pic=itemView.findViewById(R.id.left_pic);
left_message=itemView.findViewById(R.id.left_message);
}
}
class RightViewHolder extends RecyclerView.ViewHolder {
ImageView right_pic;
TextView right_message;
public RightViewHolder(@NonNull View itemView) {
super(itemView);
right_pic=itemView.findViewById(R.id.right_pic);
right_message=itemView.findViewById(R.id.right_message);
}
}
}