平铺视图控件 (STileView)¶
SOUI 中的平铺视图控件,以网格形式展示项目,支持自适应布局和固定大小布局,适用于图片、图标等内容的网格展示。基于虚拟化(adapter)技术实现,可以高效处理大量数据。
基本信息¶
- 类名:
STileView - 控件标签:
tileview - 基类:
SPanel(TPanelProxy<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 几乎一致,只是模板要同时给出 itemWidth 与 itemHeight,项的定位由 STileViewItemLocator 按网格算出。数据同样用 ILvAdapter(SAdapterBase)。完整可运行示例见 demos/wxDemo/MainDlg.cpp(tileview_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);
}