day23 Recyclerview、XRecyclerview的使用:上拉加载 下拉刷新、万能适配器、ItemTouchHelpe实现拖拽和侧滑删除

简介

RecyclerView是什么
从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。RecyclerView的官方定义如下:
A flexible view for providing a limited window into a large data set.
从定义可以看出,flexible(可扩展性)是RecyclerView的特点。

RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字Recyclerview即回收view也可以看出。

优点

RecyclerView并不会完全替代ListView(这点从ListView没有被标记为@Deprecated可以看出),两者的使用场景不一样。但是RecyclerView的出现会让很多开源项目被废弃,例如横向滚动的ListView, 横向滚动的GridView, 瀑布流控件,因为RecyclerView能够实现所有这些功能。

RecylerView相对于ListView的优点如下:

·RecyclerView封装了viewholder的回收复用,也就是说RecyclerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的逻辑被封装了,写起来更加简单。
·提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。
·设置布局管理器以控制Item的布局方式,横向、竖向以及瀑布流方式
·可设置Item的间隔样式(可绘制)
通过继承RecyclerView的ItemDecoration这个类,然后针对自己的业务需求去书写代码。
·可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecyclerView有其自己默认的实现。

但是关于Item的点击和长按事件,需要用户自己去实现。
重要方法·

1.RecyclerView横向滑动:
LinearLayoutManager.HORIZONTAL横向滑动LinearLayoutManager.VERTICAL垂直滑动
2.RecyclerView.Adapter中刷新方法区别:
notifyDataSetChanged();整体刷新+没有动画效果
notifyItemInserted(int position,Object data):有动画效果+添加一条数据在position位置
notifyItemRemoved(position);有动画效果+删除一条数据并刷新
注意:当添加和删除的时候,要更新下标,不然有错位现象
先在集合中删除要删除的数据
之后
myRecyclerViewAdapter.notifyItemRangeChanged(0,arrayList.size());
3.RecyclerView多布局展示:
public int getItemViewType(int position)返回当前数据的itemview类型
4.RecyclerView常见方法:
LinearLayoutManager:recyclerview线性管理器(垂直水平方向);
GridLayoutManager:网格布局管理器;
StaggeredGridLayoutManager:瀑布流布局管理器;
RecyclerView.setLayoutManager(LayoutManager manager):添加布局管理器
RecyclerView.addItemDecoration(ItemDecoration decoration):添加分割线
RecyclerView.setItemAnimator(ItemAnimator animator):添加动画方法
RecyclerView.setAdapter(Adapter adapter):添加适配器

RecyclerView的使用

1.导入依赖
implementation ‘com.android.support:recyclerview-v7:28.0.0’

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/my_recycler_view">

    </android.support.v7.widget.RecyclerView>

</LinearLayout>

2.适配器

点击事件(接口回调)

public interface MyClickListener {
   
    void onItemClick(int i);
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
   

    ArrayList<HashMap<String,String>> arrayList;
    Context context;
    MyClickListener myClickListener;

    public MyAdapter(ArrayList<HashMap<String, String>> arrayList, Context context,MyClickListener myClickListener) {
   
        this.arrayList = arrayList;
        this.context = context;
        this.myClickListener = myClickListener;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
   
        View view = View.inflate(context,R.layout.item,null);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, final int i) {
   
        myViewHolder.textView.setText(arrayList.get(i).get("title"));
        myViewHolder.textView2.setText(arrayList.get(i).get("intro"));
        Glide.with(context).load(arrayList.get(i).get("strUrl")).apply(RequestOptions.bitmapTransform(new RoundedCorners(20))).into(myViewHolder.imageView);
        myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
   
            @Override
            public void onClick(View v) {
   
                myClickListener.onItemClick(i);
            }
        });
    }

    @Override
    public int getItemCount() {
   
        return arrayList.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder{
   

        ImageView imageView;
        TextView textView,textView2;

        public MyViewHolder(@NonNull View itemView) {
   
            super(itemView);
            imageView = itemView.findViewById(R.id.item_img);
            textView = itemView.findViewById(R.id.item_txt);
            textView2 = itemView.findViewById(R.id.item_txt2);
        }
    }
}

实现多布局(联系人)

注意添加权限
适配器

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
   

    ArrayList<MyContent> arrayList;
    Context context;

    public MyRecyclerViewAdapter(ArrayList<MyContent> arrayList, Context context) {
   
        this.arrayList = arrayList;
        this.context = context;
    }

    @Override
    public int getItemViewType(int position) {
   
        return arrayList.get(position).getFlag();
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
   
        if (i == 0){
   
            View view = LayoutInflater.from(context).inflate(R.layout.item_title,viewGroup,false);
            return new TitleViewHolder(view);
        }else {
   
            View view = LayoutInflater.from(context).inflate(R.layout.item_phone,viewGroup,false);
            return new PhoneViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
   
        if (arrayList.get(i).getFlag() == 0){
   
            TitleViewHolder titleViewHolder = (TitleViewHolder) viewHolder;
            titleViewHolder.textView.setText(arrayList.get
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值