读取xml的简单分页处理
这个东西功能很简单,没有什么技术含量。只是记录一下。
xml 的数据获取后,可以通过一个简单分页处理来完成简单分页效果。
1.利用求余和除法的方法判断页数
这个是一个比较常见的做法,也是一种办法。在这里,不对这种分页处理要达到什么最优化的效果进行讨论,这里只是探讨一种办法。对一些数据量不大的做法,可以尝试一下这些。然而对于过大的数据量,则需要其他办法处理。我对数据库并不熟悉,甚至可以说早已经遗忘了很多。不过,利用现在的资源处理一下这些还算可以。
假设,xml 有50条的信息,我们每一页只是显示10条,则50/10=5;计算出5页。
假设,xml 有51条信息,我们需要进行分页,每一页显示10条,则51/10=5.....1(余1) 则我们需要分页数为5+1=6页。
可以假设推导,当除尽的时候,容易计算出页数,当不能计算出,我们则通过求余的方式来判断是否求可以整除。 (页数%2==0).
下面就是一个思路。
if(总页数%2==0)
{
分页数=总页数/每一页的条数
}
else
{
分页数=总页数/每一页的条数+1;
}
有了这个办法之后,我们写一个简单类实现这个功能。
view plaincopy to clipboardprint?
{
//分页类
public class Page
{
private var max:int;
private var pagenum:int;
private var currentPages:int;
public function Page()
{
}
//设置分页项数
public function set MaxRow(max:int):void
{
this.max=max;
}
//获取分页项数
public function get MaxRow():int
{
return max;
}
public function set currentPage(value:int):void
{
this.currentPages=value;
}
public function get currentPage():int
{
return currentPages;
}
//获取总的分页数,利用求余的方式判断是不是整页
public function getPageNumber(total:int):int
{
if (total%MaxRow==0)
{
pagenum=total/MaxRow;
} else
{
pagenum=int(total/MaxRow)+1;
}
return pagenum;
}
public function get TotalPage():int
{
return pagenum;
}
//显示页码
public function getPage():String
{
var str:String=(currentPage+1)+"/"+TotalPage;
return str;
}
}
}
2.接下来,我们还需要对其进行分页处理。
3扩展文本,为了实现了一个提示的作用,因此为文本扩展一个字符串
{
import flash.text.*;
//扩展文本
public class TextFieldEx extends TextField
{
public var toopTip:String;
public function TextFieldEx()
{
}
}
}
4 总的文档类。
package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.*;
import flash.text.*;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.navigateToURL;
import com.web.Page;
import com.web.TextFieldEx;
public class Main extends MovieClip
{
private var list:Array=new Array();
private var url:Array=new Array();//超链接数据
private var description:Array=new Array();//新闻的简短描述
private var count:int=0;//点击次数的计算器
private var temp:int=0;
private var total:int;
private var contain:Sprite=new Sprite();
private var page:Page=new Page();//分页类
private var toolcontain:Sprite=new Sprite();
public function Main()
{
init();
}
private function init():void
{
page.MaxRow=10;//设置最大的页数
var loader:URLLoader=new URLLoader();
loader.addEventListener(Event.COMPLETE,completeHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR,ErrorHandler);
loader.load(new URLRequest("http://www.people.com.cn/rss/politics.xml"));
Btn_Preview.addEventListener(MouseEvent.CLICK,onPreview);
Btn_Next.addEventListener(MouseEvent.CLICK,onNext);
Btn_Preview.buttonMode =true;
Btn_Next.buttonMode =true;
addChild(contain);
addChild(toolcontain);
page.currentPage=count;
}
private function onPreview(event:MouseEvent):void
{
if (count!=0)
{
count--;
page.currentPage=count;
showTitle();
}
}
private function onNext(event:MouseEvent):void
{
if (count<total-1)
{
count++;
page.currentPage=count;
showTitle();
}
}
private function completeHandler(event:Event):void
{
var xml:XML=XML(event.target.data);
read(xml);
total=page.getPageNumber(list.length);//进行分页处理
showTitle();//显示新闻标题
}
private function ErrorHandler(event:IOErrorEvent):void
{
throw new Error("路径或者xml错误");
}
//读取远程的xml数据
private function read(xml:XML):void
{
for each (var node:XML in xml..item)
{
list.push(node.title);
url.push(node.link);
description.push(node.description);
}
}
//输出新闻标题
private function showTitle():void
{
clearAll(contain);
var k:int=0;
temp=page.MaxRow*(count+1)>list.length ? list.length :page.MaxRow*(count+1);
for (var i:int=page.MaxRow*count; i<temp; i++)
{
var txt:TextFieldEx=new TextFieldEx();
contain.addChild(txt);
txt.x=30;
txt.width=500;
txt.height=23;
txt.y=txt.height*k+10;
txt.border=true;
txt.toopTip=description[i];
txt.htmlText="<a href=""+url[i]+"" mce_href=""+url[i]+"">"+list[i]+"</a>";//进行超链接
txt.addEventListener(MouseEvent.ROLL_OVER,onRoll);
txt.addEventListener(MouseEvent.ROLL_OUT,onRoll);
txt.selectable=false;
txt.addEventListener(TextEvent.LINK,onLink);
k++;
}
pageMsg.text=page.getPage();;
}
//进行超链接
private function onLink(event:TextEvent):void
{
navigateToURL(new URLRequest(event.text));
//navigateToURL(new URLRequest(event.currentTarget.URL));
}
private function onRoll(event:MouseEvent):void
{
switch(event.type)
{
case MouseEvent.ROLL_OVER:
event.currentTarget.textColor=0xff0000;
ShowtoolTip( event.currentTarget.toopTip);
break;
case MouseEvent.ROLL_OUT:
event.currentTarget.textColor=0x000000;
clearAll(toolcontain);
break;
}
}
//进行提示
private function ShowtoolTip(msg:String):void
{
clearAll(toolcontain);
var tool:TextField=new TextField();
toolcontain.addChild(tool);
tool.text=msg;
tool.wordWrap=true;
tool.width=300;
tool.background=true;
tool.backgroundColor=0xCCCCCC;
tool.autoSize=TextFieldAutoSize.LEFT;
tool.x=mouseX+20;
tool.y=mouseY;
}
//利用求余办法来求出分页的总页数
private function clearAll(contain:Sprite):void
{
while (contain.numChildren>0)
{
contain.removeChildAt(0);
}
}
}
}
获取XML数据源
现在开始,我们看看是怎样获取到xml的资源?这次我们使用的xml 并不是在本地里面进行,而是通过外部网络的rss提供的xml 数据进行解析
loader.addEventListener(Event.COMPLETE,completeHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR,ErrorHandler);
loader.load(new URLRequest("http://www.people.com.cn/rss/politics.xml"));
读取完成xml后,我们对一些数据进行保存,使用数组进行对xml 的标题,连接地址。描述进行处理。
显示数据一种处理方法
保存了这些后,现在开始我们就通过交互性的操作让xml 看起来就像分页一样。
每一次,我们读取的数据是限定的,假设我设置每一页最多显示的数据为10,那么通过计算出分页码,每次通过循环的显示出数组里面的内容
0---10
11---21
22---32
33---43
这样的方式进行处理;
关键一个地方处理输出的条件。开始--限制输出的条数判断
temp=page.MaxRow*(count+1)>list.length ? list.length :page.MaxRow*(count+1);
for (var i:int=page.MaxRow*count; i<temp; i++)
private function showTitle():void
{
clearAll(contain);
var k:int=0;
temp=page.MaxRow*(count+1)>list.length ? list.length :page.MaxRow*(count+1);
for (var i:int=page.MaxRow*count; i<temp; i++)
{
var txt:TextFieldEx=new TextFieldEx();
contain.addChild(txt);
txt.x=30;
txt.width=500;
txt.height=23;
txt.y=txt.height*k+10;
txt.border=true;
txt.toopTip=description[i];
txt.htmlText="<a href=""+url[i]+"" mce_href=""+url[i]+"">"+list[i]+"</a>";//进行超链接
txt.addEventListener(MouseEvent.ROLL_OVER,onRoll);
txt.addEventListener(MouseEvent.ROLL_OUT,onRoll);
txt.selectable=false;
txt.addEventListener(TextEvent.LINK,onLink);
k++;
}
pageMsg.text=page.getPage();;
}
鼠标交互性:翻页
弄好了这个,我们讨论鼠标的交互性,当我们点击了按钮后,我们希望进行分页的效果。在这里笔者想到一个点击数的计算办法
通过人的点击数来计算出显示出那一页。
private function onPreview(event:MouseEvent):void
{
if (count!=0)
{
count--;
page.currentPage=count;
showTitle();
}
}
private function onNext(event:MouseEvent):void
{
if (count<total-1)
{
count++;
page.currentPage=count;
showTitle();
}
}
count 变量为 鼠标点击计数器,初始化0;当点击了那么就会变成1.
点击是数需要进行一定的限制,不能超过总的分页数total(为分页后的数)
显示页码
通过鼠标交互,就能显示出不同的页数了。最后就是显示页码了
public function getPage():String
{
var str:String=(currentPage+1)+"/"+TotalPage;
return str;
}
不足地方依旧很大,只能算一个简单demo 效果了。