列表组控件

继承窗口控件,列表子项控件,请参考(列表子项控件)。 list
在InoneGUI系统里,列表主要分为2大类:

  1. 普通列表【IDE list循环选项为:否,参考上图】,如文件列表;
  2. 循环列表【IDE list循环选项为:是,参考上图】,如日期选择列表;

列表在GUI里算是比较复杂的类型,涉及到多种性能提升要点。 主要涉及的如下回调接口和用户主动通知接口:

  1. 获取列表总数 INT GetListItemCount(LTScrollList *pControl);
  2. 构建列表项数据 INT BuildListItemData(LTScrollList pControl, LTListItem pListItem, INT iIndex);
  3. 通知列表选择项数据 VOID NotifySelectedListItem(LTScrollList pControl, LTListItem pListItem, INT iIndex);
  4. 用户刷新列表数据 VOID UserNotifyDataChanged(LTScrollList pScrollList, LTListItem pListItem = NULL, INT iSelectedIndex = 0);
  5. 用户控制列表滚动到某项 VOID SetScrollListIndex(INT iFirstIndex);

控件回调获取用户列表的项数量

/**   
 *  @brief 控件回调获取用户列表的项数量   
 *  
 *  @param [in] pControl 列表对象指针  
 *              
 *  @return [out] 用户列表总数量  
 *  
 *  @details More details   
 */   

INT GetListItemCount(LTScrollList *pControl)
例如:控件获取用户列表的项数量:
INT DgCtrl::List1_GetListItemCount(LTScrollList \
pControl)
{
return 10;
}*

控件回调构建列表项数据

/**   
 *  @brief 控件回调构建列表项数据,数据数量要与总数匹配,避免数据溢出   
 *  
 *  @param [in] pControl 列表对象指针  
 *  @param [in] pListItem 列表项对象指针  
 *  @param [in] iIndex 列表项索引值,从0开始    
 *              
 *  @return [out] ERR_OK:此列表项有效[显示] / ERR_INVALID:此列表项无效[不显示]  
 *  
 *  @details More details   
 */   

INT BuildListItemData(LTScrollList *pControl, LTListItem *pListItem, INT iIndex)
例如:控件回调构建列表项数据,构建测试数据项0~3:
STRING gListlitemData[] = {"Data0", "Data1", "Data2", "Data3"};
INT DgCtrl::List1_BuildListItemData(LTScrollList \
pControl, LTListItem *pListItem, INT iIndex)
{
pListItem->SetText(gListlitemData[iIndex]);
return ERR_OK;
}*

**注意:** 如果用户列表项数量([参考回调获取用户列表的项数量](#link_GetListItemCount))返回值\<=0时,此函数会被调用一次,且iindex参数固定为-1,在情况下用户可以响应列表异常时的提示信息,如提示“空列表”。< font="">

控件回调通知列表选择项数据

/**   
 *  @brief 控件回调通知列表选择项数据,主要用于循环列表场景    
 *  
 *  @param [in] pControl 列表对象指针  
 *  @param [in] pListItem 列表项对象指针  
 *  @param [in] iIndex 列表项索引值,从0开始    
 *              
 *  @return [out] 无返回值  
 *  
 *  @details More details   
 */   

VOID NotifySelectedListItem(LTScrollList *pControl, LTListItem *pListItem, INT iIndex)
例如:控件回调通知列表选择项数据:
VOID DgCtrl::List1_NotifySelectedListItem(LTScrollList \
pControl, LTListItem *pListItem, INT iIndex){}*

用户主动刷新列表数据

/**   
 *  @brief 用户主动刷新列表数据    
 *  
 *  @param [in] pScrollList 列表对象指针  
 *  @param [in] pListItem 列表项对象指针  
 *  @param [in] iSelectedIndex 列表项索引值,从0开始    
 *              
 *  @return [out] 无返回值  
 *  
 *  @details More details   
 */   

VOID UserNotifyDataChanged(LTScrollList *pScrollList, LTListItem *pListItem = NULL, INT iSelectedIndex = 0)

【重要】下面是此函数的三种用法【下面所使用参数请结合页面头文件使用】:

  • 刷新全部列表数据并选择某项【注意:第一参数列表对象要有效,第二参数LTListItem要为空】,如:刷新全部列表数据并选择第8项 UserNotifyDataChanged(mpList1, NULL, 8);
  • 通过索引值刷新某列表项数据 【注意:第一参数列表对象要有效,第二参数为列表参考列表项对象】,如:刷新第8项数据但不更新选择项 UserNotifyDataChanged(mpList1, mpSublistitem1, 8);
  • 通过列表项对象刷新某列表项数据 【注意:第一参数列表对象要有效,第二参数为保存的某列表项对象plistitem0,第三参数采用默认值即可】,如:刷新plistitem0对象的数据但不更新选择项 UserNotifyDataChanged(mpList1, plistitem0);

用户控制列表滚动到某项

/**   
 *  @brief 用户控制列表滚动到某项    
 *  
 *  @param [in] iFirstIndex 列表首显示索引值,从0开始    
 *              
 *  @return [out] 无返回值  
 *  
 *  @details More details   
 */   

VOID SetScrollListIndex(INT iFirstIndex);
例如:用户控制列表滚动到第8项: mpList1->SetScrollListIndex(8);

列表项回调处理点击事件

/**   
 *  @brief 列表项回调处理点击事件    
 *  
 *  @param [in] pControl 控件对象   
 *  @param [in] iIndex 列表项索引值,从0开始    
 *  @param [in] bLongClick 列表项事件是否为长按事件    
 *              
 *  @return [out] 无返回值  
 *  
 *  @details More details   
 */   

VOID ListItemClick(LTListItem *pListItem, INT iIndex, BOOL bLongClick) = 0;
例如:列表项点击事件回调处理:
VOID XXXX_ListItemClick(LTListItem \
pControl, INT iIndex, BOOL bLongClick)*

列表子项回调处理点击事件

/**   
 *  @brief 列表子项回调处理点击事件    
 *  
 *  @param [in] pControl 控件对象   
 *  @param [in] <font color="Red">wParam 用作列表子项的索引值,便于用户关联列表项数据</font>    
 *  @param [in] lParam 参数未使用     
 *              
 *  @return [out] 无返回值  
 *  
 *  @details More details   
 */   

VOID OnClick(LTControl *pControl, WPARAM wParam, LPARAM lParam);
例如:列表子项点击事件回调处理,存储开关状态:
VOID XXXX_OnClick(LTControl \
pControl, WPARAM wParam, LPARAM lParam){
gListlitemData[wParam].bSw = pControl->IsSelected();
}*

列表子项回调处理长按点击事件

/**   
 *  @brief 列表子项回调处理长按点击事件    
 *  
 *  @param [in] pControl 控件对象   
 *  @param [in] <font color="Red">wParam 用作列表子项的索引值,便于用户关联列表项数据</font>    
 *  @param [in] lParam 参数未使用     
 *              
 *  @return [out] 无返回值  
 *  
 *  @details More details   
 */   

VOID OnLongClick(LTControl *pControl, WPARAM wParam, LPARAM lParam);
例如:列表子项长按点击事件回调处理,存储开关状态:
VOID XXXX_OnLongClick(LTControl \
pControl, WPARAM wParam, LPARAM lParam){
gListlitemData[wParam].bSw = pControl->IsSelected();
}*

用户控制列表滚动到某页

/**   
 *  @brief 用户控制列表滚动到某页    
 *  
 *  @param [in] iPageIndex 页索引值,从0开始   
 *              
 *  @return [out] 返回值OK:ERR_OK, 返回值NG:ERR_INVALID  
 *  
 *  @details More details   
 */   

INT SetScrollListPageIndex(INT iPageIndex);
例如:用户控制列表滚动到第2页:
SetScrollListPageIndex(2);

获取列表的当前页索引值和总页数

/**   
 *  @brief 用户控制列表滚动到某页    
 *  
 *  @param [out] iPageIndex 返回当前页索引值,从0开始   
 *  @param [out] iPageTotal 返回总页数              
 *  @return [out] 返回值OK:ERR_OK, 返回值NG:ERR_INVALID  
 *  
 *  @details More details   
 */   

INT GetScrollListPageIndex(INT &iPageIndex, INT &iPageTotal);
例如:获取列表的当前页索引值和总页数:
INT iPageIndex = 0;
INT iPageTotal = 0;
GetScrollListPageIndex(iPageIndex, iPageTotal);

用户控制列表翻下一页

/**

 *  @brief 用户控制列表翻下一页    
 *  
 *  @param [in] VOID              
 *  @return [out] 返回值真:TRUE, 返回值假:FALSE  
 *  
 *  @details More details   
 */   
  **BOOL NextPage();**  
***例如:用户控制列表翻下一页:  
NextPage();***

用户控制列表翻上一页

/**

 *  @brief 用户控制列表翻上一页    
 *  
 *  @param [in] VOID              
 *  @return [out] 返回值真:TRUE, 返回值假:FALSE  
 *  
 *  @details More details   
 */   
  **BOOL PrevPage();**  
***例如:用户控制列表翻上一页:  
PrevPage();***

列表使用技巧

  1. 设置列表不要滑动效果

     mpXXXList->ClrCtrlAttribByBit(CTRL_ATTRIB_MOVE); //关闭列表滑动
     //默认为开启滑动效果,如关闭后需再次开启滑动
     mpXXXList->SetCtrlAttribByBit(CTRL_ATTRIB_MOVE); //开启列表滑动
    
  2. 设置列表选中效果

    列表单选效果

    INT ixxxselectedindex = -1;
    VOID XXXCtrl::XXX_ListItemClick(InoListItem *pControl, INT iIndex, BOOL bLongClick){
        //Notify update select item
        if (ixxxselectedindex != iIndex)  {
            INT ioselectedindex = ixxxselectedindex;
            ixxxselectedindex = iIndex;
            UserNotifyDataChanged(mpXxxList, mpXxxItem, ioselectedindex);  //Update old focus data
            UserNotifyDataChanged(mpXxxList, mpXxxItem, iIndex);           //update new focus data
        }
        ...
    }
    
    INT XXXCtrl::XXX_BuildListItemData(InoScrollList *pControl, InoListItem *pListItem, INT iIndex)
    {
        //setting update selected item
        if (ixxxselectedindex != -1 && ixxxselectedindex == iIndex){
            pListItem->SetSelected(TRUE);
        }else{
            pListItem->SetSelected(FALSE);
        }
        ...
    }
    

    列表多选效果

    参考单选用法,区别: 1.不用去掉旧的选中项; 2.不用通知旧数据改变;3.需要考虑选中项 自行存储,用于数据处理和后面选中项UI效果清除。

Copyright © 2021 深圳合一智联科技有限公司 all right reserved,powered by Gitbook最后修改时间: 2023-07-22 11:09:02

results matching ""

    No results matching ""