您的位置:首页 > 其它

每天学一点flash(63) 读取xml后的简单分页处理

2009-12-21 11:27 591 查看
这个东西功能很简单,没有什么技术含量。只是记录一下。

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;

}

有了这个办法之后,我们写一个简单类实现这个功能。

package com.web
{
//分页类
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扩展文本,为了实现了一个提示的作用,因此为文本扩展一个字符串

package com.web
{

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 数据进行解析

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"));


读取完成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 效果了。

引发的问题:

由于swf 并不是所有文件都允许加载进来。因此对外部的xml 文件,要是没有crossdomain.xml文件的支持,那么就会进行出错

例如:读取新浪的RSSxml文件。

http://blog.sina.com.cn/crossdomain.xml

可以发现,所以打开swf 读取外部的rss的xml文件,所以对比一下使用这个文件。检查一下对方是否有crossdomain.xml的文件。

只有服务器允许了,这样我们打开swf 就可以加载到外部的文件了而不发生异常。

<?xml version="1.0" encoding="UTF-8" ?>
- <cross-domain-policy>
<allow-access-from domain="blog.sina.com.cn" />
<allow-access-from domain="control.blog.sina.com.cn" />
<allow-access-from domain="sjs.sinajs.cn" />
<allow-access-from domain="simg.sinajs.cn" />
<allow-access-from domain="icp.api.sina.com.cn" />
<allow-access-from domain="icp.api.cws.sina.com.cn" />
<allow-access-from domain="api.blog.sina.com.cn" />
<allow-access-from domain="blog.2008.sina.com.cn" />
<allow-access-from domain="blogimg.sinajs.cn" />
<allow-access-from domain="blogjs.sinajs.cn" />
<allow-access-from domain="blogold.sinajs.cn" />
<allow-access-from domain="blog.photo.sina.com.cn" />
<allow-access-from domain="photo.sina.com.cn" />
<allow-access-from domain="blog.sports.sina.com.cn" />
<allow-access-from domain="circle.blog.sina.com.cn" />
<allow-access-from domain="photo.blog.sina.com.cn" />
<allow-access-from domain="widget.say-on.com" />
<allow-access-from domain="edu.photo.sina.com.cn" />
<allow-access-from domain="baby.photo.sina.com.cn" />
</cross-domain-policy>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: