用RecyclerView实现滚动页面显示

RecyclerView:

在安卓开发者网站上,对于RecyclerView的使用说明是:

如果您的应用需要根据大型数据集(或频繁更改的数据)显示元素的滚动列表,您应使用本页所述的 RecyclerView。

从表面上看,RecyclerView的作用和ListView类似,都是用来显示大量元素的,将元素以滚动的形式显示,但是RecyclerView 比 ListView 更高级且更具灵活性。它是一个用于显示庞大数据集的容器,可通过保持有限数量的视图进行非常有效的滚动操作。 如果您有数据集合,其中的元素将因用户操作或网络事件而在运行时发生改变,请使用 RecyclerView 。

从它类名上看,RecyclerView代表的意义是,我只管Recycler View,也就是说RecyclerView只管回收与复用View,其他的你可以自己去设置。可以看出其高度的解耦,给予你充分的定制自由(所以你才可以轻松的通过这个控件实现ListView,GirdView,瀑布流等效果)。

在ListView中 改变列表某一个item数据,然后刷新列表,会回到最顶部,而RecyclerView可以保持原来滑动的位置不变。

当然,说到 RecyclerView 的优点,就不得不提它的 插拔式 的体验,高度解耦:

布局(显示方式):可通过LayoutManager(LinearLayoutManagerGridLayoutManager,StaggeredGridLayoutManager
)设置; 分割线:通过 ItemDecoration 实现 Item 增删动画:通过 ItemAnimator ViewHolder
的创建和绑定:通过实现 Adapter

基础知识补充

LayoutManager:RecyclerView 会根据 Layout Manager
提供的视图来填充自身,常用的布局管理器有LinearLayoutManager(线性布局管理器)、GridLayoutManager(网格布局管理器)、StaggeredGridLayoutManager
(瀑布流布局管理器)等。 ViewHolder:列表中的视图由 ViewHolder 实例展示。 ViewHolder
用于对控件的实例进行缓存,负责显示子项。例如,如果列表显示了音乐集合,那么每个 ViewHolder 可能代表一个专辑。
Adapter:ViewHolder 对象由 Adapter 管理。Adapter 按需创建
ViewHolder,并为其绑定数据。绑定意味着根据 Adapter 中的位置为子视图填充对应的数据。

RecyclerView 的核心使用流程如下:

mRecyclerView = findView(R.id.id_recycler_view); //设置布局管理器
mRecyclerView.setLayoutManager(mLayoutManager); //设置adapter
mRecyclerView.setAdapter(mAdapter) //设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator()); //添加分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(
getActivity(), DividerItemDecoration.HORIZONTAL_LIST));

通过 RecyclerView 轻松实现一个普通列表:
首先创建一个recyclerview布局文件;


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:fitsSystemWindows="true"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/collect_recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

再创建一个用于在recyclerview中显示的项,recycleritems;


<?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="wrap_content"
    android:padding="6dp"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/touxiangimg"
        android:layout_width="50dp"
        android:layout_height="50dp"
        tools:srcCompat="@drawable/tab_find_frd_pressed" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="vertical">

        <TextView
            android:id="@+id/nametext"
            android:layout_width="match_parent"
            android:layout_height="25dp"
            android:textSize="15dp"
            android:text="TextView" />

        <TextView
            android:id="@+id/numbertext"
            android:layout_width="match_parent"
            android:layout_height="25dp"
            android:textSize="15dp"
            android:text="TextView" />
    </LinearLayout>
</LinearLayout>

显示效果如下:

在这里插入图片描述

创建一个用于recycleritems的对象类FriendList;

import java.io.Serializable;

public class FriendList implements Serializable {
    public String imgPath;//头像地址
    public String FriendName;//朋友姓名
    public String FriendNumber;//朋友电话

    public FriendList(String imgPath, String FriendName, String FriendNumber) {
        this.imgPath = imgPath;
        this.FriendName = FriendName;
        this.FriendNumber = FriendNumber;
    }

    public String getImgPath() {
        return imgPath;
    }

    public void setImgPath(String imgPath) {
        this.imgPath = imgPath;
    }

    public String getFriendName() {
        return FriendName;
    }

    public void setFriendName(String FriendName) {
        this.FriendName = FriendName;
    }

    public String getFriendNumber() {
        return FriendNumber;
    }

    public void setFriendNumber(String FriendNumber) {
        this.FriendNumber = FriendNumber;
    }

    @Override
    public String toString() {
        return "FriendList{" +
                "imgPath='" + imgPath + '\'' +
                ", FriendName='" + FriendName + '\'' +
                ", FriendNumber='" + FriendNumber + '\'' +
                '}';
    }
}

创建recyclerview的适配器;

public class CollectRecycleAdapter extends RecyclerView.Adapter<CollectRecycleAdapter.myViewHodler> {
    private Context context;
    private ArrayList<FriendList> friendListList;





    //创建构造函数
    public CollectRecycleAdapter(Context context, ArrayList<FriendList> friendListList) {
        //将传递过来的数据,赋值给本地变量
        this.context = context;//上下文
        this.friendListList = friendListList;//实体类数据ArrayList
    }

    /**
     * 创建viewhodler,相当于listview中getview中的创建view和viewhodler
     *
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public myViewHodler onCreateViewHolder(ViewGroup parent, int viewType) {
        //创建自定义布局
        View itemView = View.inflate(context, R.layout.recycleritems, null);
        return new myViewHodler(itemView);
    }

    /**
     * 绑定数据,数据与view绑定
     *
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(myViewHodler holder, int position) {
        //根据点击位置绑定数据
        FriendList data = friendListList.get(position);
        //holder.mItemImg.setImageResource(R.drawable.mars2);
        holder.mItemFriendName.setText(data.FriendName);//获取实体类中的name字段并设置
        holder.mItemFriendNumber.setText(data.FriendNumber);//获取实体类中的price字段并设置

    }

    /**
     * 得到总条数
     *
     * @return
     */
    @Override
    public int getItemCount() {
        return friendListList.size();
    }

    //自定义viewhodler
    class myViewHodler extends RecyclerView.ViewHolder {
        private ImageView mItemImg;
        private TextView mItemFriendName;
        private TextView mItemFriendNumber;

        public myViewHodler(View itemView) {
            super(itemView);
            mItemImg = (ImageView) itemView.findViewById(R.id.touxiangimg);
            mItemFriendName = (TextView) itemView.findViewById(R.id.nametext);
            mItemFriendNumber = (TextView) itemView.findViewById(R.id.numbertext);
            //点击事件放在adapter中使用,也可以写个接口在activity中调用
            //方法一:在adapter中设置点击事件
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //可以选择直接在本位置直接写业务处理
                    //Toast.makeText(context,"点击了xxx",Toast.LENGTH_SHORT).show();
                    //此处回传点击监听事件
                    if(onItemClickListener!=null){
                        onItemClickListener.OnItemClick(v, friendListList.get(getLayoutPosition()));
                    }
                }
            });
            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    if (onItemClickListener != null) {
                        onItemClickListener.OnItemLongClick(v, friendListList.get(getLayoutPosition()));
                    }
                    return true;
                }
            });

        }
    }

    /**
     * 设置item的监听事件的接口
     */
    public interface OnItemClickListener {
        /**
         * 接口中的点击每一项的实现方法,参数自己定义
         *
         * @param view 点击的item的视图
         * @param data 点击的item的数据
         */
        void OnItemClick(View view, FriendList data);

        void OnItemLongClick(View view, FriendList data);
    }

    //需要外部访问,所以需要设置set方法,方便调用
    private OnItemClickListener onItemClickListener;

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }
}


将recyclerview封装在fragment,调用Adapter中的方法;

public class LianxirenFragment extends Fragment {
    private View view;//定义view用来设置fragment的layout
    public RecyclerView mCollectRecyclerView;//定义RecyclerView
    //定义以goodsentity实体类为对象的数据集合
    private ArrayList<FriendList> friendLists = new ArrayList<FriendList>();
    //自定义recyclerveiw的适配器
    private CollectRecycleAdapter mCollectRecyclerAdapter;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //获取fragment的layout
        view = inflater.inflate(R.layout.tab02, container, false);
        //对recycleview进行配置
        initRecyclerView();
        //模拟数据
        initData();
        //CollectRecycleAdapter.initData();
        return view;
    }

    /**
     * TODO 模拟数据
     */
    private void initData() {
        for (int i=0;i<20;i++){
            FriendList friendList =new FriendList("","","");
            friendList.setImgPath("C:\\Users\\VULCAN\\AndroidStudioProjects\\MyWeChat\\app\\src\\main\\res\\drawable\\earth2.png");
            friendList.setFriendName("name"+i);
            friendList.setFriendNumber("10100"+i);
            friendLists.add(friendList);
        }
    }

    /**
     * TODO 对recycleview进行配置
     */

    private void initRecyclerView() {
        //获取RecyclerView
        mCollectRecyclerView=(RecyclerView)view.findViewById(R.id.collect_recyclerView);
        //创建adapter
        mCollectRecyclerAdapter = new CollectRecycleAdapter(getActivity(), friendLists);
        //给RecyclerView设置adapter
        mCollectRecyclerView.setAdapter(mCollectRecyclerAdapter);
        //设置layoutManager,可以设置显示效果,是线性布局、grid布局,还是瀑布流布局
        //参数是:上下文、列表方向(横向还是纵向)、是否倒叙
        mCollectRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
        //设置item的分割线
        mCollectRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL));
        //RecyclerView中没有item的监听事件,需要自己在适配器中写一个监听事件的接口。参数根据自定义
        mCollectRecyclerAdapter.setOnItemClickListener(new CollectRecycleAdapter.OnItemClickListener() {
            @Override
            public void OnItemClick(View view, FriendList data) {
                //此处进行监听事件的业务处理
                Toast.makeText(getActivity(),"我是name",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void OnItemLongClick(View view,FriendList data){
                Toast.makeText(getActivity(),"Long click"+data.getFriendNumber(),Toast.LENGTH_SHORT).show();
            }

        });
}}

到这里,在fragment里面实现recyclerview就基本结束了,你可以将配置好的fragment在mainactivility里面调用,在这里我是在之前写的类微信界面的项目中使用,可以在gitee上查看具体的代码。

代码地址
https://gitee.com/fyl253711android/Android_project.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值