跳转至

平铺视图控件 (STileView)

SOUI 中的平铺视图控件,以网格形式展示项目,支持自适应布局和固定大小布局,适用于图片、图标等内容的网格展示。基于虚拟化(adapter)技术实现,可以高效处理大量数据。

基本信息

  • 类名STileView
  • 控件标签tileview
  • 基类SPanelTPanelProxy<ITileView> + SViewBase
  • 功能:提供网格形式的项目展示

重要纠正:旧文档列出的 align(int,left/center/right)属性在 STileView 源码中不存在——项的对齐由模板与布局参数控制,不是 tileview 的独立 XML 属性。下为对照源码后的正确属性表。

属性说明

STileView::SOUI_ATTRS_BEGIN 中声明的属性,并通过 ATTR_CHAIN_CLASS(SViewBase) 继承选择相关属性:

自身属性

属性名 类型 默认值 是否重绘 说明
marginSize layoutsize 未设置(0) 网格项之间的间距(外边距)
wantTab bool false 是否响应 Tab 键在项之间切换焦点(由 SViewBase 提供)
multiSel bool false 是否允许多选(由 SViewBase 提供)

说明:项尺寸(itemWidth / itemHeight)通过 <template> 及项定位器(STileViewItemLocator)控制,不是 tileview 的 XML 属性。

使用示例

tileview 以网格排布项,用法与 listview 几乎一致,只是模板要同时给出 itemWidthitemHeight,项的定位由 STileViewItemLocator 按网格算出。数据同样用 ILvAdapterSAdapterBase)。完整可运行示例见 demos/wxDemo/MainDlg.cpptileview_gzh 等)。

1. XML 模板

<tileview pos="0,0,-0,-0" name="tile_gzh"
          wantTab="1" marginSize="20"
          sbSkin="skin_scrollbar" sbWid="8">
    <template itemWidth="60" itemHeight="90"
              colorHover="rgba(100,100,100,50)" colorSelected="#FFFFFF">
        <window>
            <img name="img_icon" pos="0,0,-0,@45" skin="skin_default_gzh32"/>
            <text name="txt_name" pos="0,@50,-0,-0" align="center"/>
        </window>
    </template>
</tileview>

2. 实现适配器(C++)

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

struct Gzh { SStringT strName; SStringT strIcon; };

class CGzhTileAdapter : public SAdapterBase
{
public:
    void Add(const Gzh &g) { m_items.Add(g); 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 Gzh &g = m_items[position];
        pItem->FindChildByName2<SStatic>(L"txt_name")->SetWindowText(g.strName);
        pItem->FindChildByName(L"img_icon")->SetAttribute(L"skin", S_CT2W(g.strIcon));
    }
private:
    SArray<Gzh> m_items;
};

3. 绑定

void InitTile(STileView *pTile)
{
    CGzhTileAdapter *pAdapter = new CGzhTileAdapter;
    pAdapter->Add({_T("公众号A"), _T("skin_default_gzh32")});
    pTile->SetAdapter(pAdapter);
    pAdapter->Release();
    pTile->SetMultiSel(TRUE);
}

相关主题