分页ArrayList

时间:2012-04-25 10:14:22

标签: java arraylist pagination

我正在尝试为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++;
  }

但这似乎也不起作用。你们可以发现并帮助我解决这个问题。 谢谢你们。

3 个答案:

答案 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)]