【问题标题】:Primefaces datatable live scrolling not working with lazy loadingPrimefaces数据表实时滚动不适用于延迟加载
【发布时间】:2014-04-10 13:38:23
【问题描述】:

参考here 帖子中给出的建议,我尝试使用实时滚动实现延迟加载以处理大型数据集,但是当 rows 都不会发生实时滚动使用了数据表的 scrollRows 属性。如果我删除 rows 属性,则不会显示任何记录。这是我尝试过的代码 sn-p。如果我是,有人可以帮帮我吗做错了什么。

JSF代码sn-p

<p:dataTable id="arcRecList" var="data"
        value="#{archivedRecordBean.archModel}" lazy="true"
        tableStyle="table-layout:auto; width:80%;" styleClass="datatable"
        scrollable="true" scrollWidth="84%" scrollHeight="81%"
        columnClasses="columnwidth" liveScroll="true" scrollRows="20"
        filteredValue="#{archivedRecordBean.filteredArchiveItems}"
        resizableColumns="true" rows="20">


        <p:column headerText="Insured" filterBy="#{data.insuredName}"
           sortBy="#{data.insuredName}" filterMatchMode="contains"
           style="width:15%;white-space:pre-line;" escape="false"
           filterStyle="width:80% !important; margin-top:25px;"
           sortFunction="#{archivedRecordBean.sortColumn}">
           <h:outputText value="#{data.insuredName}" />
           <!--   style="width:250px" -->
        </p:column>
                             .
                             .
                             .

     </p:dataTable>

托管豆

@ManagedBean
@ViewScoped

public class ArchivedRecordBean implements Serializable {

   private List<LPINFO> archiveItems=null;
   private List<LPINFO>filteredArchiveItems;
   private LPINFO objLPINFO=null;
   JdbcConnection jdbcConnection=null;
   Connection connection=null;
   Statement selectStmt=null;
   ResultSet rs=null;
   private transient LazyDataModel<LPINFO> archModel;
   public ArchivedRecordBean()

   {


      getArchiveFields();

   }
   @PostConstruct
   public void init()
   {


      archModel=new LazyArchiveDataModel(archiveItems);
   }
   public List<LPINFO> getArchiveItems() {
      System.out.println("inside getter");
      return archiveItems;
   }
   public void setArchiveItems(List<LPINFO> archiveItems) {
      this.archiveItems = archiveItems;
   }
   public LPINFO getObjLPINFO() {
      return objLPINFO;
   }
   public void setObjLPINFO(LPINFO objLPINFO) {
      this.objLPINFO = objLPINFO;
   }

   public List<LPINFO> getFilteredArchiveItems() {
      return filteredArchiveItems;
   }
   public void setFilteredArchiveItems(List<LPINFO> filteredArchiveItems) {
      this.filteredArchiveItems = filteredArchiveItems;
   }


   public LazyDataModel<LPINFO> getArchModel() {



      return archModel;
   }
   public void setArchModel(LazyDataModel<LPINFO> archModel) {
      this.archModel = archModel;
   }
   public void getArchiveFields()
   {
      System.out.println("inside getArchiveFields");
      ArchiveRecordsDao daoObject=new ArchiveRecordsDao();
      archiveItems=daoObject.getArchiveRecords();




   }



}

DAO 类

    public class ArchiveRecordsDao {

    JdbcConnection con = null;
    Connection connection;
    Statement selectStmt;

   public ResultSet rs = null;

   private List<LPINFO> archiveItems = null;

   public LPINFO objWorkSpaceItem = null;

   public List<LPINFO> getArchiveRecords()
   {

      try
      {
         con=new JdbcConnection();
         connection=con.getJdbcConnection();
         selectStmt=connection.createStatement();
         String query="select * from LPINFO where LPINFO.ClearDate < (select TOP 1 Tbl_CurrentYear.CurrentYear from dbo.Tbl_CurrentYear)"
               +"AND (LPINFO.ClearDate is not null)";
         rs=selectStmt.executeQuery(query);
         archiveItems=new ArrayList<LPINFO>();

         while(rs.next())
         {

            objWorkSpaceItem=new LPINFO();
            objWorkSpaceItem.setInsuredName(rs.getString("InsuredName"));
                        .
                        .
                        .
            archiveItems.add(objWorkSpaceItem);


         }


      }
      catch(Exception e)
      {
         e.printStackTrace();
      }
      finally
      {
         try {

            connection.close();
         } catch (SQLException e) {

            e.printStackTrace();
         }

      }
      return archiveItems;

   }

}

LazyDataModel 类

   public class LazyArchiveDataModel extends LazyDataModel<LPINFO> {

    private List<LPINFO> datasource;

    public LazyArchiveDataModel(List<LPINFO> datasource) {
        this.datasource = datasource;
    }

    @Override
    public void setRowIndex(int rowIndex) {
        /*
         * The following is in ancestor (LazyDataModel):
         * this.rowIndex = rowIndex == -1 ? rowIndex : (rowIndex % pageSize);
         */
        if (rowIndex == -1 || getPageSize() == 0) {
            super.setRowIndex(-1);
        }
        else
            super.setRowIndex(rowIndex % getPageSize());
    }

    @Override
    public LPINFO getRowData(String rowKey) {
        for(LPINFO lpinfo : datasource) {
            if(lpinfo.getLPID().equals(rowKey))
                return lpinfo;
        }

        return null;
    }

    @Override
    public Object getRowKey(LPINFO lpinfo) {
        return lpinfo.getLPID();
    }

    @Override
    public List<LPINFO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {
        List<LPINFO> data = new ArrayList<LPINFO>();

        //filter
        for(LPINFO lpinfo : datasource) {
            boolean match = true;

            for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
                try {
                    String filterProperty = it.next();
                    String filterValue = filters.get(filterProperty);
                    String fieldValue = String.valueOf(lpinfo.getClass().getField(filterProperty).get(lpinfo));

                    if(filterValue == null || fieldValue.startsWith(filterValue)) {
                        match = true;
                    }
                    else {
                        match = false;
                        break;
                    }
                } catch(Exception e) {
                    match = false;
                }
            }

            if(match) {
                data.add(lpinfo);
            }
        }

        //sort
        /*if(sortField != null) {
            Collections.sort(data, new LazySorter(sortField, sortOrder));
        }*/

        //rowCount
        int dataSize = data.size();
        this.setRowCount(dataSize);

        //paginate
        if(dataSize > pageSize) {
            try {
                return data.subList(first, first + pageSize);
            }
            catch(IndexOutOfBoundsException e) {
                return data.subList(first, first + (dataSize % pageSize));
            }
        }
        else {
            return data;
        }
    }
}

【问题讨论】:

    标签: jsf-2 primefaces datatable lazy-loading


    【解决方案1】:

    据我了解,使用行的文档会与 scrollRows 冲突。

    这是关于这两个属性的 PrimeFaces 文档:

    rows:(整数)每页面显示的行数(分页)

    scrollRows:(整数)要在实时滚动上加载的行数。(滚动)

    现在这里的问题不仅仅是行,我认为是scrollWidth="84%" scrollHeight="81%"

    作为文档,这两个属性是 Integer(s),因此您实际上不会看到任何记录,因为 scrollHeight 定义错误。

    scrollHeight:(整数)滚动视口高度。

    scrollWidth(整数)滚动视口宽度。

    尝试将它们设置为固定的整数像素,例如 500。

    希望这会有所帮助。

    【讨论】:

    • 嗨,Hatem,当我用像素替换百分比并删除 rows 属性并仅保留 scrollRows 时,没有加载任何行:(
    • 不喜欢这个“500px”你是说?它应该只有“500”,没有像素
    • 按照您的建议做了,但结果相同 :(。我正在使用带有 primefaces 3.5 的 JSF 2.0。此功能是否在更高版本中可用。如果您使用 JSF 和 primefaces,请发布一些工作示例.
    • 我的例子是4.0的,不知道是不是和3.5有关,试试更新看看....
    猜你喜欢
    • 2014-12-20
    • 2017-09-12
    • 2014-04-07
    • 2014-08-25
    • 2013-01-09
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多