2012-04-25 8 views
1

ArrayListに保持されている値の単純なページネーションルーチンを作成しようとしています。基本的に私がしたいのは、先にArrayListの最初の5つの要素をレンダリングすることです。ユーザーがNext (increment by another 5)Previous (decrease by 5)をクリックしたとき。ArrayListを改ページする

私のロジックは次のようになります。私はpagePreviousコールに問題がある

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 
    ... 
    } 
} 
} 

、君たちは私がvaluesToRender配列にレンダリングするために値を追加する前にvalues arrayアップvaluesToRender5ステップを構築を支援することができます。

また、私はこのような何かをやってみました:

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

はこれを確認してください。それはあなたを助けるかもしれません - http://stackoverflow.com/questions/8755619/java-arraylist-navigation –

答えて

1

に私はこのようにそれを行うだろう:

を私はrenderValuesが何をするかわからない、と私たちは持っているかどうかを1または多分defaultStepを減算しますmoveCounterの上限から。

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行はそうのような二つの大きな三experssionsにパックすることができます

mc = ((mc + s) < 0) ? 0 : ((mc + s) > vs) ? vs : (mc + s); 

が、3行のソリューションは従う方が良いです。 「pscuderi」に基づき、

+0

このようにすると、 'renderValues(..)はそのままで、あるいは2番目のオプションがフィットしていると思います。おそらく変化する必要がありますか? – Bitmap

+0

さて、私は 'renderValues'が何をしているのか分かりません。変数名は分かりにくいです。 StartIndexとcheckStepsは変更可能ですか?たぶん、あなたはそれらをiまたはnと呼んでください。私はpagePrevの仕事は、スコープを何とか戻すことだと思っていました。たとえば、17-22から12-17に、境界違反をチェックします(-3を防ぐ)。レイアウトの後の作業は、renderValuesで行われます。解くべきタスクが1つしかない短いメソッドを作成する。 –

1

変更

if (moveCounter > -1 && moveCounter <= archive.size()) 
{ 
    renderValues(moveCounter-1, true); 
} 

if (moveCounter > 0 && moveCounter <= archive.size()) 
{ 
    renderValues(moveCounter-1, true); 
} 
0

solution here 私はこれを探している誰かのために役に立つことができラッピングクラスを構築しました:

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class PaginatedList<T> { 

private static final int DEFAULT_PAGE_SIZE = 10; 

private List<T> list; 
private List<List<T>> listOfPages; 
private int pageSize = DEFAULT_PAGE_SIZE; 
private int currentPage = 0; 

public PaginatedList(List<T> list) { 
    this.list = list; 
    initPages(); 
} 

public PaginatedList(List<T> list, int pageSize) { 
    this.list = list; 
    this.pageSize = pageSize; 
    initPages(); 
} 

public List<T> getPage(int pageNumber) { 
    if (listOfPages == null || 
     pageNumber > listOfPages.size() || 
     pageNumber < 1) { 
     return Collections.emptyList(); 
    } 

    currentPage = pageNumber; 
    List<T> page = listOfPages.get(--pageNumber); 
    return page; 
} 

public int numberOfPages() { 
    if (listOfPages == null) { 
     return 0; 
    } 

    return listOfPages.size(); 
} 

public List<T> nextPage() { 
    List<T> page = getPage(++currentPage); 
    return page; 
} 

public List<T> previousPage() { 
    List<T> page = getPage(--currentPage); 
    return page; 
} 

public void initPages() { 
    if (list == null || listOfPages != null) { 
     return; 
    } 

    if (pageSize <= 0 || pageSize > list.size()) { 
     pageSize = list.size(); 
    } 

    int numOfPages = (int) Math.ceil((double) list.size()/(double) pageSize); 
    listOfPages = new ArrayList<List<T>>(numOfPages); 
    for (int pageNum = 0; pageNum < numOfPages;) { 
     int from = pageNum * pageSize; 
     int to = Math.min(++pageNum * pageSize, list.size()); 
     listOfPages.add(list.subList(from, to)); 
    } 
} 

public static void main(String[] args) { 
    List<Integer> list = new ArrayList<Integer>(); 
    for (int i = 1; i <= 62; i++) { 
     list.add(i); 
    } 

    PaginatedList<Integer> paginatedList = new PaginatedList<Integer>(list); 
    while (true) { 
     List<Integer> page = paginatedList.nextPage(); 
     if (page == null || page.isEmpty()) { 
      break; 
     } 

     for (Integer value : page) { 
      System.out.println(value); 
     } 

     System.out.println("------------"); 
    } 
} 

}