Skip to content

组合视图控件 (SComboView)

Warning

The current page still doesn't have a translation for this language.

You can read it through google translate.

SOUI 中的组合视图控件,它继承 SComboBase,在下拉框中嵌入一个 SListView 作为内容,从而支持在下拉区域展示虚拟化列表(自定义模板、大量数据)。SComboView 自身没有新增 XML 属性,全部属性来自基类 SComboBase,下拉内容由内嵌的 listview 模板决定。

基本信息

  • 类名SComboView
  • 控件标签comboview
  • 基类SComboBaseTComboBaseProxy<IComboView>
  • 功能:提供下拉式自定义列表视图选择功能

重要纠正:旧文档列出的 dropWidth 属性在 SComboBase 源码中不存在——下拉框只有 dropHeight(高度),宽度默认跟随控件自身宽度。其余属性(下拉、按钮皮肤、动画、提示文字、匹配等)来自 SComboBase

属性说明

SComboView 继承 SComboBase::SOUI_ATTRS_BEGIN 中的全部属性:

继承属性(来自 SComboBase)

属性名 类型 默认值 是否重绘 说明
dropDown 自定义 true 是否为下拉式(true 下拉列表,false 等同普通编辑框)
dropHeight layoutsize 200(dp) 下拉框高度
curSel int -1 初始选中项索引
btnSkin skin 系统皮肤 SKIN_SYS_DROPBTN 下拉按钮皮肤
animateTime int 200 下拉/收起动画时长(毫秒)
autoFitDropBtn int true 是否自动适配下拉按钮尺寸
cueColor color #cccccc 提示文字(cueText)颜色
cueText string ""(空) 未选择时的提示文字
autoMatch bool false 输入时是否自动匹配项
autoDropdown bool false 输入时是否自动展开下拉框

下拉内容模板

下拉区域是一个 SListView,通过 <liststyle> / <template> 子节点定义项模板:

<comboview pos="10,10,200,40" name="combo_basic"
           dropHeight="200" cueText="请选择...">
    <liststyle>
        <template itemHeight="30">
            <text pos="5,|-15" name="txt_name"/>
        </template>
    </liststyle>
</comboview>

使用示例

comboview = SComboBox 的下拉区域换成了一个内嵌的 listview,因此下拉项同样是模板 + 适配器驱动。editstyle 决定输入区,下拉内容由 liststyle 内的 <template> 决定,数据用 ILvAdapterSAdapterBase)。

1. XML

<comboview pos="10,10,200,40" name="combo_search"
           dropHeight="240" cueText="搜索..." autoMatch="1">
    <editstyle inset="5,0,5,0" colorBkgnd="#FFFFFF"/>
    <liststyle>
        <template itemHeight="60">
            <window>
                <img name="img_icon" pos="5,5,55,55" skin="skin_default_personal32"/>
                <text name="txt_title" pos="65,10" font="bold:1"/>
                <text name="txt_desc"  pos="65,35" colorText="#666666"/>
            </window>
        </template>
    </liststyle>
</comboview>

2. 实现下拉项适配器(C++)

#include <helper/SAdapterBase.h>
#include <control/SComboView.h>

struct Cand { SStringT strTitle; SStringT strDesc; };

class CSearchAdapter : public SAdapterBase
{
public:
    void Add(const Cand &c) { m_items.Add(c); notifyDataSetChanged(); }
protected:
    virtual int WINAPI getCount() override { return m_items.GetCount(); }
    virtual void WINAPI getView(int position, SItemPanel *pItem,
                                SXmlNode xmlTemplate) override
    {
        if (pItem->GetChildrenCount() == 0)
            pItem->InitFromXml(&xmlTemplate);
        const Cand &c = m_items[position];
        pItem->FindChildByName2<SStatic>(L"txt_title")->SetWindowText(c.strTitle);
        pItem->FindChildByName2<SStatic>(L"txt_desc")->SetWindowText(c.strDesc);
    }
private:
    SArray<Cand> m_items;
};

3. 绑定与取值

void InitCombo(SComboView *pCombo)
{
    CSearchAdapter *pAdapter = new CSearchAdapter;
    pAdapter->Add({_T("张三"), _T("在线")});
    pAdapter->Add({_T("李四"), _T("离线")});
    pCombo->SetAdapter(pAdapter);
    pAdapter->Release();

    pCombo->SetCurSel(0);
}

// 下拉项被选中时(订阅 EventCBSelChanged / EventCmd)
void OnSelChanged(SComboView *pCombo)
{
    int iSel = pCombo->GetCurSel();
    SListView *pLV = pCombo->GetListView();
    // 通过 pLV->GetAdapter() 取回适配器读取对应数据
}

SComboView::SetAdapter 作用于内嵌的 listview;其余下拉框行为(按钮皮肤、动画、提示文字、匹配)由基类 SComboBase 的 XML 属性控制。

相关主题