unity组件UIScrollView下拉加载新的数据

来源:互联网 发布:甲骨文云计算大会 编辑:程序博客网 时间:2024/06/14 03:27

前提


今天记录的是我在项目中遇到的一个小需求,关于UIScrollRect组件滑动到最下面时再次滑动则可以加载数据的问题,类似于平日我们刷新微博。

在刚开始做需求的时候有点小苦恼,因为要判断列表是不是滑倒最下面一行有点小复杂,而且时间又特别急,没时间让我去研究它的源码。这时让我发现了 Scrollbar 组件,可以说是让我眼前一亮,一个非常简单的方法就出来了。关于如何使用Scrollbar 和ScrollRect组件,大家可以去百度下,我就不介绍了。

一:组件部分


  1、创建一个Canvas,在Canvas下添加Panel。


  2、在Panel上添加ScroRect组件


                 


  3、在Panel下添加一个空物体 改名为Grid添加 GirdLayoutGroup与ContentSizeFitter 组件并进行相应合适的设置


          


  4、在Canvas下添加Scroll bar,根据自己的需求去设置,这个控件就是用来判断列表是否到最底部,因为我的项目中不

需要有这个控件,所以我把控件上面的所有图片都隐藏掉了,只使用功能。



  5、回来设置ScroRect组件,将Grid 与ScrollBar 拖到相应的地方




6、制作单条列表的预制件,在这里简单制作,所以我就创建了一张图片并添加了Text组件 显示信息区别每一条列表信息

二:预制件的代码

在预制件上我添加了ItemControl 脚本用来简单的控制单条信息的显示,代码如下:


非常简单,获取到子物体上的Text组件并且进行赋值。


三:主要控制代码


接下来就是主要的代码了,我在Panel上添加了一个test脚本,继承MonoBehaviour,与IEndDragHandler接口,并且实现IEndDragHandler接口中的OnEndDrag()方法,当我们滑动列表结束的时候将会调用OnEndDrag()方法,注意在这里不是滑动到列表的最下面时调用,而是我们每一次滑动结束时这个方法就会被触发。


 
1、首先绑定我们需要的 scrollbar ,GridLayoutGroup 还有我们的预制件

    public Scrollbar bar;//获得Scrollbar组件    public GridLayoutGroup vGroup;//获得GridLayoutGroup组件    public ItemControl item;//添加预制件
    
2、在Start方法中 初始化数据与列表的状态

 private void Start()    {        AddItem();//添加数据        //将列表移动到第一条数据        bar.value = 1;    }


在这里 bar.value=1 是因为我出现了每次加载后都是从中间的数据显示,列表移动了中间位置,并不是从第一条数据显示,估计是我哪个地方没有设置好,设置了半天又没有找到,所有直接通过滚动条的value值,把数据移动到了第一条。
3、接下来就是添加数据,每一次添加5条数据。
 void AddItem() {                for (int i = 0; i < 5; i++)        {            GameObject newItem = AddItemGameobject(item.gameObject, vGroup.gameObject);            string str = "现在是第:" + indexItem + "项," + "第:" + index + "条";            newItem.GetComponent<ItemControl>().ShowItemText(str);        }    }    public  GameObject AddItemGameobject(GameObject o, GameObject parent)    {        index++;//创建的第几条数据                GameObject go = GameObject.Instantiate(o) as GameObject;        go.transform.SetParent(parent.transform);//设置父物体,将数据添加到 Grid物体下面,并且设置位置,大小。        go.transform.localPosition = Vector3.zero;        go.transform.localScale = Vector3.one;        return go;    }
     
 4、接下来就要实现刷新了,开始我们实现了OnEndDrag()方法,用来检测滑动结束,所有我们的刷新就在放在这里,然后我们通过bar.value的值来判断有没有到最后一条数据,bar.value值永远都是从0~1进行改变,之前我们也选择的是从下到上,所以0就代表了最下面 , 1 代表顶层。

代码如下:

  public void OnEndDrag(PointerEventData eventData)    {        if (bar.value == 0) {//判断当最下面的时候就进行加载,同理我们做上拉刷新时,只要判断value是否等于1            indexItem++;//第几次创建            AddItem(); //加载数据        }    }


同理当我们用到上拉刷新的时候也可以使用这个方法。


整体代码:

using UnityEngine;using System.Collections;using UnityEngine.UI;using UnityEngine.EventSystems;public class test : MonoBehaviour, IEndDragHandler{        public Scrollbar bar;//获得Scrollbar组件    public GridLayoutGroup vGroup;//获得GridLayoutGroup组件    public ItemControl item;//添加预制件    private int index = 0;    private int indexItem = 1;    private void Start()    {        AddItem();//添加数据        //将列表移动到第一条数据        bar.value = 1;    }    public void OnEndDrag(PointerEventData eventData)    {        if (bar.value == 0) {//判断当最下面的时候就进行加载,同理我们做上拉刷新时,只要判断value是否等于1            indexItem++;//第几次创建            AddItem(); //加载数据        }    }    void AddItem() {                for (int i = 0; i < 5; i++)        {            GameObject newItem = AddItemGameobject(item.gameObject, vGroup.gameObject);            string str = "现在是第:" + indexItem + "项," + "第:" + index + "条";            newItem.GetComponent<ItemControl>().ShowItemText(str);        }    }    public  GameObject AddItemGameobject(GameObject o, GameObject parent)    {        index++;//创建的第几个物体                GameObject go = GameObject.Instantiate(o) as GameObject;        go.transform.SetParent(parent.transform);//设置服务体,将数据添加到 Grid物体下面        go.transform.localPosition = Vector3.zero;        go.transform.localScale = Vector3.one;        return go;    }}


四:运行




因为我这里隐藏了ScrollBar组件上的所有图片 所有这里ScrollBar不会显示出来



五:总结


到这里今天的记录就到这里了,非常简单,可以在这基础上添加 异步读取数据,添加加载时的提示等等。