列表组控件
继承窗口控件,列表子项控件,请参考(列表子项控件)。
在InoneGUI系统里,列表主要分为2大类:
- 普通列表【IDE list循环选项为:否,参考上图】,如文件列表;
- 循环列表【IDE list循环选项为:是,参考上图】,如日期选择列表;
列表在GUI里算是比较复杂的类型,涉及到多种性能提升要点。 主要涉及的如下回调接口和用户主动通知接口:
- 获取列表总数 INT GetListItemCount(LTScrollList *pControl);
- 构建列表项数据 INT BuildListItemData(LTScrollList pControl, LTListItem pListItem, INT iIndex);
- 通知列表选择项数据 VOID NotifySelectedListItem(LTScrollList pControl, LTListItem pListItem, INT iIndex);
- 用户刷新列表数据 VOID UserNotifyDataChanged(LTScrollList pScrollList, LTListItem pListItem = NULL, INT iSelectedIndex = 0);
- 用户控制列表滚动到某项 VOID SetScrollListIndex(INT iFirstIndex);
- 查找列表子项对象 psubbtn = (InoButton *)pListItem->FindControlById(ID_XXX_LISTSUBITEM1);
控件回调获取用户列表的项数量
/**
* @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开始,-1为空列表值用于提示信息
*
* @return [out] ERR_OK:此列表项有效[显示] / ERR_INVALID:此列表项无效[不显示]
*
* @details More details
*/
INT BuildListItemData(LTScrollList *pControl, LTListItem *pListItem, INT iIndex)
**注意:** 如果用户列表项数量([参考回调获取用户列表的项数量](#link_GetListItemCount))返回值\<=0时,此函数会被调用一次,且iindex参数固定为-1,在情况下用户可以响应列表异常时的提示信息,如提示“空列表”。< font=""> =0时,此函数会被调用一次,且iindex参数固定为-1,在情况下用户可以响应列表异常时的提示信息,如提示“空列表”。<>
例如:控件回调构建列表项数据,构建测试数据项0~3:
STRING gListlitemData[] = {"Data0", "Data1", "Data2", "Data3"};
INT DgCtrl::List1_BuildListItemData(InoScrollList \pControl, InoListItem *pListItem, INT iIndex)
{
if (iIndex < 0)
{
pListItem->SetText("List empty...");
return ERR_OK;
}
InoButton *psubitem1= (InoButton *)pListItem->FindControlById(ID_LISTSUBITEM1);
InoButton *psubitem2= (InoButton *)pListItem->FindControlById(ID_LISTSUBITEM2);
}*
控件回调通知列表选择项数据
/**
* @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();***
列表使用技巧
设置列表不要滑动效果
mpXXXList->ClrCtrlAttribByBit(CTRL_ATTRIB_MOVE); //关闭列表滑动 //默认为开启滑动效果,如关闭后需再次开启滑动 mpXXXList->SetCtrlAttribByBit(CTRL_ATTRIB_MOVE); //开启列表滑动
设置列表选中效果
列表单选效果
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效果清除。