我正在尝试为ArrayList
中保存的值创建一个简单的分页例程。基本上我想要做的是首先在ArrayList
中渲染前五个元素。然后,当用户点击Next (increment by another 5)
和Previous (decrease by 5)
。
我的逻辑看起来像这样:
class foo
{
private static final int defaultStep = 5;
private int moveCounter;
private List<String> values;
public foo()
{
values = new ArrayList<String>();
values.add("Fiber Channel");
values.add("Copper Channel");
...
}
private void pageNext()
{
if (moveCounter > -1 && moveCounter < values.size())
{
int currentIndex = (moveCounter + 1);
renderValues(currentIndex, false);
}
}
private void pagePrevious()
{
if (moveCounter > -1 && moveCounter <= values.size())
{
renderValues(moveCounter-1, true);
}
}
private void renderValues(int startIndex, boolean isPreviousCall)
{
if (startIndex > -1)
{
StringBuilder html = new StringBuilder();
List<String> valuesToRender = new ArrayList<String>();
int checkSteps = 1;
while (startIndex < values.size())
{
valuesToRender.add(values.get(startIndex));
if (checkSteps == defaultStep) break;
startIndex++;
checkSteps++;
}
moveCounter = startIndex;
//TODO: Build html String
...
}
}
}
我遇到pagePrevious
来电时遇到问题,您可以帮我构建valuesToRender
5个步骤向上values array
,然后再添加要渲染的值valuesToRender
数组。
我也尝试过这样的事情:
for (int start = startIndex, end = values.size() - 1; start < end; start++, end--)
{
if (isPreviousCall) valuesToRender.add(values.get(end));
else valuesToRender.add(values.get(start));
if (checkSteps == defaultStep) break;
checkSteps++;
}
但这似乎也不起作用。你们可以发现并帮助我解决这个问题。 谢谢你们。
答案 0 :(得分:1)
更改
if (moveCounter > -1 && moveCounter <= archive.size())
{
renderValues(moveCounter-1, true);
}
到
if (moveCounter > 0 && moveCounter <= archive.size())
{
renderValues(moveCounter-1, true);
}
答案 1 :(得分:1)
我会这样做:
我不确定renderValues的作用,以及我们是否必须从moveCounter的上限减去1或者defaultStep。
private void pageMove (int step)
{
moveCounter = moveCounter + step;
if (moveCounter < 0) moveCounter = 0;
if (moveCounter > values.size ()) moveCounter = values.size ();
renderValues (currentIndex, false);
}
private void pageNext ()
{
pageMove (defaultStep);
}
private void pagePrevious ()
{
pageMove (-defaultStep);
}
前3行可以打包成两个大的三元表达式,如下:
mc = ((mc + s) < 0) ? 0 : ((mc + s) > vs) ? vs : (mc + s);
但3线解决方案更好。
答案 2 :(得分:1)
基于“pscuderi”solution here 我已经构建了一个包装类,可以帮助那些寻找这个的人:
[[0] for i in range(n)]