2012-06-13 4 views
1

Je suis bloqué depuis quelques jours, en essayant de développer une méthode de gestion des pages de résultats dans un moteur de recherche (comme le système de pagination google).Pagination en Java

J'ai le nombre total de résultats, la page actuelle (commence à partir de 1 ... à ... Dernière page), et le nombre de résultats par page (disons 10 par page).

au bas de la page de résultats JSP, je veux afficher les données tabulaires de pages comme suit:

suppose que le moteur de recherche a donné 470 résultats. - Sur la base de "10 résultats par page", nous aurons un total de 47 pages (470/10)

Voici ce que je veux afficher

« précédent 2 3 4 5 6 7 8 9 10 Suivant "> lorsque l'on clique sur la 10 la page voici ce qui devrait se produire:

"précédent 5 6 7 8 9 10 11 12 13 14 Suivant" si la 14e page est cliqué, puis:

" précédent 9 10 11 12 13 14 15 16 17 18 Suivant "ans et ainsi de suite ...

J'ai réussi à faire ce qui suit

public class Test { 

public static int [] getIntervalNumberPages(
     final int pNumberHits, 
     final int pNumberTotalHits, 
     final int pNumberCurrentPage, 
     final int pNumberResultsPerPage) { 

    // Page interval 
    final int NB_PAGES_INTERVAL = 10; 

    // Initialise table 
    int [] vResult = new int [0]; 

    // If no results found or if number of documents per page = 0 
    if (pNumberHits != 0 && pNumberResultsPerPage != 0) { 
     // Total number of pages 
     int vNumberTotalPages = (int) java.lang.Math.ceil(pNumberTotalHits/(double) pNumberResultsPerPage); 
     // First number of the list 
     int vPremierNumero = 0; 

     // Last number of the list 
     int vDernierNumero = 0; 
     // managing multiples 
     if (pNumberCurrentPage >= NB_PAGES_INTERVAL && pNumberCurrentPage % NB_PAGES_INTERVAL == 0) { 
      vPremierNumero = (pNumberCurrentPage/NB_PAGES_INTERVAL - 1) * NB_PAGES_INTERVAL + 1; 
      vDernierNumero = java.lang.Math.min(vNumberTotalPages, (pNumberCurrentPage/NB_PAGES_INTERVAL - 1) * NB_PAGES_INTERVAL + NB_PAGES_INTERVAL); 
     } else { 
      vPremierNumero = pNumberCurrentPage/NB_PAGES_INTERVAL * NB_PAGES_INTERVAL + 1; 
      vDernierNumero = java.lang.Math.min(vNumberTotalPages, pNumberCurrentPage/NB_PAGES_INTERVAL * NB_PAGES_INTERVAL + NB_PAGES_INTERVAL); 
     } 
     vResult = new int [vDernierNumero - vPremierNumero + 1]; 
     // Fill in table 
     for (int vCpt = 0; vCpt < vResult.length; vCpt++) { 
      vResult [vCpt] = vPremierNumero + vCpt; 
     } 
    } 

return vResult; 
} 
} 

Cependant mon code fonctionne comme suit:

"1 2 3 4 5 6 7 8 9 10 Suivant" si je clique sur la page 10> « Précédent 11 12 13 14 15 16 17 18 19 20 Suivant "ans so

quelqu'un peut-il m'aider s'il vous plaît ??

Répondre

5

Votre problème est mathématique simple. La façon dont vous renumérotez ne correspond pas à vos exigences décrites.

vPremierNumero = (pNumberCurrentPage/NB_PAGES_INTERVAL - 1) * NB_PAGES_INTERVAL 

Alors brancher de certains numéros

pNumberCurrentPage = 10 
NB_PAGES_INTERVAL = 10 

vPremierNumero = 10/9 * 10 = 100/9 = 11 

Voilà pourquoi vous êtes la première page est 11. Vous voulez changer cela en NB_PAGES_INTERVAL/2 de sorte que le numéro que vous avez cliqué sur est dans la milieu de la gamme.

2

Votre mathématique est désactivée. Vous voulez probablement quelque chose comme

vPremierNumero = Math.max (1, pNumberCurrentPage - (NB_PAGES_INTERVAL/ 2)); vDernierNumero = Math.min (vPremierNumero + NB_PAGES_INTERVAL, vNumberTotalPages);

+0

Merci beaucoup. Ceci, d'une manière très simple, a résolu le problème. Merci encore pour votre aide précieuse. – user1353307

+0

Vous êtes les bienvenus.:) – Keppil

+0

@ user1353307: Vous ne dites pas «merci» littéralement ici, mais upvote utiles, bonnes et bonnes réponses (triangle vers le haut). Celui qui vous a aidé le plus ou la meilleure réponse que vous acceptez (signe de contrôle). –

0

Voici les mathématiques de base pour ce que vous essayez de faire, vous pouvez simplement brancher le reste

public static int[] getPagination(
     int currentPage, 
     int maxPerPage, 
     int totalResults) throws IOException { 
    final int PAGES_BEFORE_AFTER = 5; 
    final int MAX_PER_PAGE = 20; 
    if (maxPerPage <= 0) { 
     maxPerPage = MAX_PER_PAGE; 
    } 

    int startRecords = 0; 
    int endRecords = totalResults; 

    boolean has_pagination = (totalResults > maxPerPage); 

    if (has_pagination) { 
     int pageCount = totalResults/maxPerPage; 
     if ((pageCount * maxPerPage) < totalResults) { 
      pageCount++; 
     } 

     startRecords = (currentPage * maxPerPage) - maxPerPage; 
     endRecords = (startRecords + maxPerPage); 

     if (totalResults <= maxPerPage) { 
      startRecords = 0; 
      endRecords = totalResults; 
     } else if (endRecords > totalResults) { 
      endRecords = totalResults; 
     } 

     boolean prev_enabled = ((currentPage != 0) && (currentPage != 1)); 
     boolean next_enabled = ((pageCount != 0) && (pageCount != currentPage)); 

     int startIndex = 0; 
     int stopIndex = pageCount; 

     if (currentPage <= PAGES_BEFORE_AFTER) { 
      startIndex = 0; 
     } else { 
      startIndex = (currentPage - PAGES_BEFORE_AFTER) - 1; 
     } 

     if ((currentPage + PAGES_BEFORE_AFTER) < pageCount) { 
      stopIndex = currentPage + PAGES_BEFORE_AFTER; 
     } else { 
      stopIndex = pageCount; 
     } 

     for (int x = startIndex; x < stopIndex; x++) { 
      boolean disabled = (currentPage == (x + 1)); 

      // buttons 
     } 
    } 

    return new int[] { startRecords, endRecords }; 
} 
0

Votre calcul du premier et le dernier numéro était incorrect, essayez ce qui suit:

// If no results found or if number of documents per page = 0 
    if (pNumberHits != 0 && pNumberResultsPerPage != 0) { 
     // Total number of pages 
     // You shouldn't create an intermediate floating number here, this trick causes the same effect 
     int vNumberTotalPages = (pNumberTotalHits + pNumberResultsPerPage - 1)/pNumberResultsPerPage; 

     int firstIndex = pNumberCurrentPage - (NB_PAGES_INTERVAL/2); 
     int lastIndex = firstIndex + NB_PAGES_INTERVAL - 1; 

     // First number of the list 
     int vPremierNumero = Math.max(firstIndex, 1); 

     // Last number of the list 
     int vDernierNumero = Math.min(lastIndex, vNumberTotalPages); 

     vResult = new int [vDernierNumero - vPremierNumero + 1]; 
     // Fill in table 
     for (int vCpt = 0; vCpt < vResult.length; vCpt++) { 
      vResult [vCpt] = vPremierNumero + vCpt; 
     } 
    }