J2ME、lwuit
自己做了一个list分页控件,只需传入数据和每页显示条数
package com.longkey.terminal.common.km;
import java.util.Vector;
import com.longkey.terminal.entity.km.MyListBodyEntity;
import com.longkey.terminal.util.km.Utils;
import com.sun.lwuit.Button;
import com.sun.lwuit.Component;
import com.sun.lwuit.Container;
import com.sun.lwuit.Form;
import com.sun.lwuit.Image;
import com.sun.lwuit.Label;
import com.sun.lwuit.List;
import com.sun.lwuit.events.ActionEvent;
import com.sun.lwuit.events.ActionListener;
import com.sun.lwuit.layouts.BorderLayout;
import com.sun.lwuit.layouts.BoxLayout;
import com.sun.lwuit.list.DefaultListCellRenderer;
import com.sun.lwuit.list.ListCellRenderer;
/**
* list分页控件
*
* @author zhoufei
*
*/
public class MyList extends Container
{
private Image unSelectedImgBar, selectedImgBar;
private Button btnUpPage, btnDownPage, btnStart, btnEnd;
private Label lbPageNum;
private int listSize, pageCount = 0, pageNow = 1;
private List listNow;
private Vector data;
private Container listContainer = new Container(), btnContainer = new Container();
private ActionListener listItemAction;
/**
*
* @param v
* 内容为MyListBodyEntity类型的Vector
*/
public MyList(Vector v)
{
this(v, 4);
}
/**
*
* @param v
* 内容为MyListBodyEntity类型的Vector
* @param n
* 每页显示的Item条数
*/
public MyList(Vector v, int n)
{
if (v == null || v.size() == 0)
{
data = new Vector();
MyListBodyEntity errorBody = new MyListBodyEntity();
errorBody.setTitle("数据为空!");
errorBody.setDate("请确认数据..");
data.addElement(errorBody);
}
else
{
data = v;
}
listSize = n;
init();
}
/**
* 初始化
*/
private void init()
{
btnUpPage = new Button(Utils.getImage("mylist_up.gif"));
btnDownPage = new Button(Utils.getImage("mylist_down.gif"));
btnStart = new Button(Utils.getImage("mylist_start.gif"));
btnEnd = new Button(Utils.getImage("mylist_end.gif"));
lbPageNum = new Label();
setMargin(btnStart, 0, 0, 30, 5);
setMargin(btnUpPage, 0, 0, 5, 10);
setMargin(btnDownPage, 0, 0, 10, 5);
setMargin(btnEnd, 0, 0, 5, 10);
lbPageNum.getStyle().setMargin(0, 0, 10, 10);
listContainer.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
listNow = loadData(pageNow - 1);
listContainer.addComponent(listNow);
btnContainer.setLayout(new BoxLayout(BoxLayout.X_AXIS));
btnContainer.addComponent(btnStart);
btnContainer.addComponent(btnUpPage);
btnContainer.addComponent(lbPageNum);
btnContainer.addComponent(btnDownPage);
btnContainer.addComponent(btnEnd);
setLayout(new BorderLayout());
addComponent(BorderLayout.CENTER, listContainer);
addComponent(BorderLayout.SOUTH, btnContainer);
btnUpPage.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
pageNow--;
rePraitList();
}
});
btnDownPage.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
pageNow++;
rePraitList();
}
});
btnStart.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
gotoPage(1);
}
});
btnEnd.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
gotoPage(pageCount);
}
});
}
/**
* 重绘List
*/
private void rePraitList()
{
listContainer.removeAll();
listNow = loadData(pageNow - 1);
listNow.addActionListener(listItemAction);
listContainer.addComponent(listNow);
Form retVal = null;
Component parent = getParent();
if (parent != null)
{
retVal = parent.getComponentForm();
}
if (retVal != null)
{
retVal.layoutContainer();
retVal.repaint();
}
else
{
layoutContainer();
repaint();
}
}
/**
* 设置边距
*/
private void setMargin(Button btn, int top, int bottom, int left, int right)
{
btn.getStyle().setMargin(top, bottom, left, right);
btn.getUnselectedStyle().setMargin(top, bottom, left, right);
btn.getSelectedStyle().setMargin(top, bottom, left, right);
btn.getPressedStyle().setMargin(top, bottom, left, right);
}
/**
* 创建List
*/
private List createList(MyListBodyEntity[] bodys, ListCellRenderer renderer)
{
List list = new List(bodys);
list.getStyle().setBgTransparency(0);
list.setListCellRenderer(renderer);
list.setOrientation(List.VERTICAL);
list.setPaintFocusBehindList(true);
return list;
}
/**
* 图片渲染器
*/
class ImageRenderer extends DefaultListCellRenderer
{
private Label focus = new Label("");
public ImageRenderer()
{
super(false);
}
public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected)
{
super.getListCellRendererComponent(list, "", index, isSelected);
setIcon(selectedImgBar);
return this;
}
public Component getListFocusComponent(List list)
{
return focus;
}
}
/**
* Body块渲染器
*
* @author zhoufei
*
*/
class BodyRenderer extends Container implements ListCellRenderer
{
private Label bodyContent = new Label("");
private Label bodyDate = new Label("");
private Label bar = new Label("");
private Label focus = new Label("");
public BodyRenderer()
{
setLayout(new BorderLayout());
addComponent(BorderLayout.WEST, bar);
Container cnt = new Container(new BoxLayout(BoxLayout.Y_AXIS));
bodyContent.getStyle().setBgTransparency(0);
bar.getStyle().setBgTransparency(0);
bodyDate.getStyle().setBgTransparency(0);
cnt.addComponent(bodyContent);
cnt.addComponent(bodyDate);
addComponent(BorderLayout.CENTER, cnt);
focus.setFocus(true);
}
public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected)
{
MyListBodyEntity b = (MyListBodyEntity) value;
if (isSelected)
{
setFocus(isSelected);
bar.setIcon(selectedImgBar);
getStyle().setBgTransparency(100);
getStyle().setBgColor(0x008080);
}
else
{
bar.setIcon(unSelectedImgBar);
getStyle().setBgTransparency(100);
getStyle().setBgColor(0x4169E1);
}
bodyContent.setText(b.getTitle());
bodyDate.setText(b.getDate());
return this;
}
public Component getListFocusComponent(List list)
{
return focus;
}
}
/**
* 算总页数,返回Bean二维数组
*
* @param data 内容为MyListBodyEntity类型的Vector
* @return 分页后的所有结果
*/
private MyListBodyEntity[][] getAllPage(Vector data)
{
int length = data.size();
// 算总页数
pageCount = (length + listSize - 1) / listSize;
MyListBodyEntity[][] page = new MyListBodyEntity[pageCount][];
int i = 0;
int num = pageCount;
for (int j = 0; j < length;)
{
if (num > 1)
{
page[i] = new MyListBodyEntity[listSize];
for (int k = 0; k < listSize; k++)
{
page[i][k] = (MyListBodyEntity) data.elementAt(j);
j++;
}
i++;
num--;
}
// 最后一页,处理不同情况的显示条数
if (num == 1)
{
if (length % listSize == 0)
{
page[i] = new MyListBodyEntity[listSize];
for (int k = 0; k < listSize; k++)
{
page[i][k] = (MyListBodyEntity) data.elementAt(j);
j++;
}
}
else
{
page[i] = new MyListBodyEntity[length % listSize];
for (int k = 0; k < length % listSize; k++)
{
page[i][k] = (MyListBodyEntity) data.elementAt(j);
j++;
}
}
}
}
return page;
}
/**
* 加载当前页
*
* @param pageNum
* 当前页码
* @return 对应页码的list
*/
private List loadData(int pageNum)
{
MyListBodyEntity[][] pagesData = getAllPage(data);
pageButtonShow();
lbPageNum.setText(pageNow + "/" + pageCount);
return createList(pagesData[pageNum], new BodyRenderer());
}
/**
* 上下页按钮控制
*/
private void pageButtonShow()
{
if (pageNow == 0)
{
btnUpPage.setEnabled(false);
btnDownPage.setEnabled(false);
return;
}
if (pageNow == 1)
{
btnUpPage.setEnabled(false);
}
else
{
btnUpPage.setEnabled(true);
}
if (pageNow == pageCount)
{
btnDownPage.setEnabled(false);
}
else
{
btnDownPage.setEnabled(true);
}
}
/**
* 根据页码跳转页面
*
* @param pageNum
* 当前页码
* @return 页码对应的list
*/
public List gotoPage(int pageNum)
{
if (pageNum <= pageCount && pageNum >= 0)
{
this.pageNow = pageNum;
rePraitList();
return getListNow();
}
if (pageNum > pageCount && pageCount > 0)
{
this.pageNow = pageCount;
rePraitList();
return getListNow();
}
return null;
}
/**
* 获得未选时显示图片
*
* @return 未选图片
*/
public Image getUnSelectedImgBar()
{
return unSelectedImgBar;
}
/**
* 设置未选时显示图片
*
* @param unSelectedImgBar
* 未选图片
*/
public void setUnSelectedImgBar(Image unSelectedImgBar)
{
this.unSelectedImgBar = unSelectedImgBar;
}
/**
* 获得选中时显示图片
*
* @return 选中图片
*/
public Image getSelectedImgBar()
{
return selectedImgBar;
}
/**
* 设置选中时显示图片
*
* @param selectedImgBar
* 选中图片
*/
public void setSelectedImgBar(Image selectedImgBar)
{
this.selectedImgBar = selectedImgBar;
}
/**
* 获得当前页
*
* @return 当前页list
*/
public List getListNow()
{
return listNow;
}
/**
* 设置ListItem的ActionListener监听
*
* @param listItemAction
*/
public void setActionListener(ActionListener listItemAction)
{
this.listItemAction = listItemAction;
listNow.addActionListener(listItemAction);// 不设置第一次加载不了监听
}
/**
* 获得ListItem的selectedIndex
*
* @return 当前选中的Item的Index
*/
public int getSelectListItem()
{
return (pageNow - 1) * listSize + listNow.getSelectedIndex();
}
/**
* 获取当前页码
*
* @return 当前页码
*/
public int getPageNow()
{
return pageNow;
}
/**
* 获得List大小,即一页显示ListItem的条数
*
* @return 每个List的size
*/
public int getListSize()
{
return listSize;
}
/**
* 获取总页数
*
* @return 总页数
*/
public int getPageCount()
{
return pageCount;
}
}