UIScrollView组件下拉加载刷新功能
发表于2018-12-05
相信很多人都玩过微博,经常会去刷新微博看新内容,那么这个功能是如何实现出来的呢,下面就要请出今天的主角UIScrollView组件,借助UIScrollView组件实现下拉加载刷新内容的功能。
注意:在实现该功能的时候需要了解如何使用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脚本用来简单的控制单条信息的显示,代码如下:
public class ItemControl : MonoBehaviour {
private Text tNum;
public void ShowItemText(string str) {
tNum = this.transform.GetComponentInChildren<text>();
tNum.text = str;
}
}</text>
非常简单,获取到子物体上的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不会显示出来
五、总结
以上就是使用UIScrollView组件实现下拉加载刷新内容,非常简单,可以在这基础上添加 异步读取数据,添加加载时的提示等等。
