Android RecycleView详解

1.RecycleView简介

 

RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比ListView更好。

RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集。RecyclerView用以下两种方式简化了数据的展示和处理:


1.使用LayoutManager来确定每一个item的排列方式。


2.为增加和删除项目提供默认的动画效果。

 


你也可以定义你自己的LayoutManager和添加删除动画,RecyclerView项目结构如下:

Android RecycleView详解_第1张图片

 

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

你可能感兴趣的:(综合)