duilib进阶教程 -- 实现List排序

来源:互联网 发布:成都表演 知乎 编辑:程序博客网 时间:2024/05/22 12:51

需求: 点击List的某个ListHeaderItem,List按照此列排序。

实现思路:在C#中好多控件都支持排序,如gridview,只要配置相应属性并实现一些方法就可以了,但duilib就不行了,一切都得自己来。

1 找到事件触发位置,在Notify方法中捕获DUI_MSGTYPE_HEADERCLICK这个消息,在比对控件名即可

2 排序处理  1)获取每一个ListItem,放入一个Vector中    2) 用sort方法对vector排序    3)把排好序的ListItem重新放置

感受:更自由,不难实现,排序速度也挺快。

部分源码 A.cpp

#include <algorithm>

// 比较函数,比较字段是名称,升序
extern bool CompareWithTitleAse(CListContainerElementUI * item1,CListContainerElementUI * item2);
// 比较函数,比较字段是名称,降序
extern bool CompareWithTitleDesc(CListContainerElementUI * item1,CListContainerElementUI * item2);

void A::Notify(TNotifyUI& msg){

...

if(msg.sType == DUI_MSGTYPE_HEADERCLICK){
CDuiString name=msg.pSender->GetName();
DoSort(name);
return;
}

}


// 排序处理
void A::DoSort(CDuiString columnName)
{
if(columnName != kTitleColumnName) {
return;
}


vector<CListContainerElementUI *> listElements;
for(int i= 0 ; i< this->GetCount(); i++){
CControlUI* pControl = this->GetItemAt(i);
if( pControl != NULL){
CListContainerElementUI* pListElement = static_cast<CListContainerElementUI*>(pControl);
listElements.push_back(pListElement);
}
}


if(columnName == kTitleColumnName){
if(m_bSortAseByTitle){
sort(listElements.begin(),listElements.end(),CompareWithTitleAse);
}else{
sort(listElements.begin(),listElements.end(),CompareWithTitleDesc);
}
m_bSortAseByTitle = !m_bSortAseByTitle;
}


vector<CListContainerElementUI *>::iterator listElementIter;
int index =0;
for(listElementIter = listElements.begin();listElementIter!=listElements.end();listElementIter++){
CListContainerElementUI *pListElement = *listElementIter;
SetItemIndex(pListElement,index);
index++;
}
}


// 比较函数,比较字段是名称,升序
bool CompareWithTitleAse(CListContainerElementUI * item1,CListContainerElementUI * item2)
{
CLabelUI * pLabelTitle1 = (CLabelUI *)item1->FindSubControl(kTitleControlName);
CLabelUI * pLabelTitle2 = (CLabelUI *)item2->FindSubControl(kTitleControlName);


if(pLabelTitle1 == NULL  || pLabelTitle2 == NULL) return false;


LPCTSTR strTitle1 = pLabelTitle1->GetText().GetData();
LPCTSTR strTitle2 = pLabelTitle2->GetText().GetData();


if(_tcscmp(strTitle1,strTitle2)<0) return true;
else return false;
}
// 比较函数,比较字段是名称,降序
bool CompareWithTitleDesc(CListContainerElementUI * item1,CListContainerElementUI * item2)
{
CLabelUI * pLabelTitle1 = (CLabelUI *)item1->FindSubControl(kTitleControlName);
CLabelUI * pLabelTitle2 = (CLabelUI *)item2->FindSubControl(kTitleControlName);


if(pLabelTitle1 == NULL  || pLabelTitle2 == NULL) return false;


LPCTSTR strTitle1 = pLabelTitle1->GetText().GetData();
LPCTSTR strTitle2 = pLabelTitle2->GetText().GetData();


if(_tcscmp(strTitle1,strTitle2)>0) return true;
else return false;
}


来张截图,其中已按名称排列


0 0