IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Soui—SListView使用例子 -> 正文阅读

[移动开发]Soui—SListView使用例子

本篇文章主要使用SListView的控件和适配器的使用,做过Android的都懂,跟Android下的listView功能差不多一致,我刚开始就只不知道Item如何点击的所以看了官方文档记录下来 写个小例子。

放上一张效果图,插入 删除 修改 没去实现 其实也是很简单的 就是修改数据源 然后刷新就行 跟Android的类似 所以没再实现

?界面布局很简单不用解释看效果图就知道

<SOUI name="mainWindow" title="@string/title" bigIcon="ICON_LOGO:32" smallIcon="ICON_LOGO:16" margin="5,5,5,5"  resizable="1" wndType="appMain"
appWnd="1"
translucent="1"
>
  <root skin="_skin.sys.wnd.bkgnd" cache="1"  width="600" height="400" >
    <caption pos="0,0,-0,30" show="1" font="adding:0">
      <icon pos="10,8" src="ICON_LOGO:16"/>
      <text pos="29,9">@string/title</text>
      <imgbtn name="btn_close" skin="_skin.sys.btn.close"    pos="-45,0" tip="close" animate="1"/>
      <imgbtn name="btn_max" skin="_skin.sys.btn.maximize"  pos="-83,0" animate="1" />
      <imgbtn name="btn_restore" skin="_skin.sys.btn.restore"  pos="-83,0" show="0" animate="1" />
      <imgbtn name="btn_min" skin="_skin.sys.btn.minimize" pos="-121,0" animate="1" />
    </caption>
    <window pos="0,[2,0,0" size="-2,-2" layout="vbox">
      <text name="displayInfo" size="-2,20"  />
      <window layout="hbox" size="-2,30">
        <button name="showlist" text="显示列表" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
        <button name="insert" text="插入" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
        <button name="deletelist" text="删除" weight="1" size="0,-2" extend_left="5" drawFocusRect="0"></button>
        <button name="modifylist" text="修改" weight="1" size="0,-2" extend_left="5" extend_right="5" drawFocusRect="0"></button>
      </window>
      <!--colorBkgnd="@color/red"-->
      <window layout="vbox" weight="1" size="-2,-1"  >
        <listview pos="0,0,-0,[-10" size="-2,-2" name="listviewDemo" dividerSize="1">
          <template itemHeight="50" colorNormal="@color/white" colorSelected="#e4f0fc" colorHover="#e4f0fc">
            <window layout="vbox" size="-2,-2" pos="|5,|0" offset="-1,-0.5">
              <text  name="name"  />
              <text  name="time" />
            </window>
          </template>
        </listview>
      </window>

    </window>
  </root>
</SOUI>

业务逻辑代码如下:

// MainDlg.cpp : implementation of the CMainDlg class
//
/

#include "stdafx.h"
#include "MainDlg.h"	
#include <helper/SAdapterBase.h>
#include <helper/STime.h>
#include "printlog.h"	

CMainDlg::CMainDlg() : SHostWnd(_T("LAYOUT:XML_MAINWND"))
{
}

CMainDlg::~CMainDlg()
{
}

class StudentsAdapter : public SAdapterBase
{
private:
	CMainDlg *out = nullptr;
public:
	struct Student
	{
		SStringT time;
		SStringT name;
	};

	SArray<Student> studentList;

public:
	StudentsAdapter(CMainDlg *cd)
	{
		out = cd;
		Student recs[] =
		{
			{
				_T("2021_9_19"),
				_T("张三"),
			},
			{
				_T("2021_9_19"),
				_T("李四"),
			},
			{
				_T("2021_9_19"),
				_T("王五"),
			},
			{
				_T("2021_9_19"),
				_T("赵六"),
			},
			{
				_T("2021_9_19"),
				_T("老七"),
			},{
				_T("2021_9_19"),
				_T("张三"),
			},
			{
				_T("2021_9_19"),
				_T("李四"),
			},
			{
				_T("2021_9_19"),
				_T("王五"),
			},
			{
				_T("2021_9_19"),
				_T("赵六"),
			},
			{
				_T("2021_9_19"),
				_T("老七"),
			}
		};

		for (int i = 0; i < ARRAYSIZE(recs); i++)
		{
			studentList.Add(recs[i]);
		}
	}

	void addStudents(Student s) {
		studentList.Add(s);
		this->notifyDataSetChanged();
	}

protected:
	virtual int getCount()
	{
		return studentList.GetCount();
	}

	virtual void getView(int position, SWindow * pItem, pugi::xml_node xmlTemplate)
	{
		if (pItem->GetChildrenCount() == 0)
		{
			pItem->InitFromXml(xmlTemplate);
		}
		Student & rec = studentList[position];
		SStatic * sStatic = pItem->FindChildByID2<SStatic>(R.id.name);
		sStatic->SetWindowText(rec.name);
		PrintLog("%s\n", rec.time);

		SStatic * sTime = pItem->FindChildByID2<SStatic>(R.id.time);
		sTime->SetWindowText(rec.time);
		pItem->SetUserData(position);
		pItem->GetEventSet()->subscribeEvent(EventItemPanelClick::EventID, Subscriber(&StudentsAdapter::OnItemClick, this));
		pItem->GetEventSet()->subscribeEvent(EventItemPanelDbclick::EventID, Subscriber(&StudentsAdapter::OnDoubleItemClick, this));

	}

	bool OnDoubleItemClick(EventArgs *pEvt) {
		EventItemPanelDbclick* pEvt_ItemPanel = sobj_cast<EventItemPanelDbclick>(pEvt);
		SASSERT(pEvt_ItemPanel);
		SWindow* pPanel = sobj_cast<SWindow>(pEvt_ItemPanel->sender);
		SOUI::CPoint pt(GET_X_LPARAM(pEvt_ItemPanel->lParam), GET_Y_LPARAM(pEvt_ItemPanel->lParam));
		SWND swnd = pPanel->SwndFromPoint(pt);
		SWindow *pClicked = NULL;
		if (swnd)
		{
			pClicked = SWindowMgr::GetWindow(swnd);
		}

		int nIndex = pPanel->GetUserData();
		PrintLogi("OnDoubleItemClick index=%s\n", nIndex);
		return true;
	}

	bool OnItemClick(EventArgs *pEvt)
	{
		EventItemPanelClick* pEvt_ItemPanel = sobj_cast<EventItemPanelClick>(pEvt);
		SASSERT(pEvt_ItemPanel);
		SWindow* pPanel = sobj_cast<SWindow>(pEvt_ItemPanel->sender);
		SOUI::CPoint pt(GET_X_LPARAM(pEvt_ItemPanel->lParam), GET_Y_LPARAM(pEvt_ItemPanel->lParam));
		SWND swnd = pPanel->SwndFromPoint(pt);
		SWindow *pClicked = NULL;
		if (swnd)
		{
			pClicked = SWindowMgr::GetWindow(swnd);
		}

		int nIndex = pPanel->GetUserData();
		PrintLogi("OnItemClick index=%s\n", nIndex);
		out->OnItemClick(nIndex);
		return true;
	}
};

bool CMainDlg::OnItemClick(int nIndex) {
	SStringT info = _T("点击Item:");
	CString str;
	str.Format(_T("%d"), nIndex);
	info.Append(str);
	displayInfo->SetWindowText(info);
	return true;
}

void CMainDlg::initView()
{
	if (insert == nullptr) {
		displayInfo = FindChildByID2<SStatic>(R.id.displayInfo);
		show = FindChildByID2<SButton>(R.id.showlist);
		insert = FindChildByID2<SButton>(R.id.insert);
		deleteList = FindChildByID2<SButton>(R.id.deletelist);
		modify = FindChildByID2<SButton>(R.id.modifylist);
		listView = FindChildByID2<SListView>(R.id.listviewDemo);
	}
}




void CMainDlg::onClick(EventArgs *pEvt) {
	SButton *pBtn = sobj_cast<SButton>(pEvt->sender);
	SStringT btnText = pBtn->GetWindowText();
	SStringT btnName = pBtn->GetName();
	OutputDebugString(btnName);
	if (btnName == _T("showlist")) {
		initView();
		ILvAdapter *pLvAdapter = new StudentsAdapter(this);
		listView->SetAdapter(pLvAdapter);
		pLvAdapter->Release();
		show->EnableWindow(false);
	}
	else if (btnName == _T("insert")) {
		SStringT info=_T("插入暂无实现");
		displayInfo->SetWindowText(info);
	}
	else if (btnName == _T("deletelist")) {
		SStringT info = _T("删除暂无实现");
		displayInfo->SetWindowText(info);
		
	}
	else if (btnName == _T("modifylist")) {
		SStringT info = _T("修改暂无实现");
		displayInfo->SetWindowText(info);
	}


}

BOOL CMainDlg::OnInitDialog(HWND hWnd, LPARAM lParam)
{
	return 0;
}
//TODO:消息映射
void CMainDlg::OnClose()
{
	SNativeWnd::DestroyWindow();
}

void CMainDlg::OnMaximize()
{
	SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE);
}
void CMainDlg::OnRestore()
{
	SendMessage(WM_SYSCOMMAND, SC_RESTORE);
}
void CMainDlg::OnMinimize()
{
	SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
}

void CMainDlg::OnSize(UINT nType, CSize size)
{
	SetMsgHandled(FALSE);
	SWindow *pBtnMax = FindChildByName(L"btn_max");
	SWindow *pBtnRestore = FindChildByName(L"btn_restore");
	if (!pBtnMax || !pBtnRestore) return;

	if (nType == SIZE_MAXIMIZED)
	{
		pBtnRestore->SetVisible(TRUE);
		pBtnMax->SetVisible(FALSE);
	}
	else if (nType == SIZE_RESTORED)
	{
		pBtnRestore->SetVisible(FALSE);
		pBtnMax->SetVisible(TRUE);
	}
}

本骗文章学习的地方列表的点击和双击事件的处理。

核心代码:

pItem->GetEventSet()->subscribeEvent(EventItemPanelClick::EventID, Subscriber(&StudentsAdapter::OnItemClick, this));
		pItem->GetEventSet()->subscribeEvent(EventItemPanelDbclick::EventID, Subscriber(&StudentsAdapter::OnDoubleItemClick, this));

看刚开始想了各种方法都不行 后面看了官方的例子找到这个订阅的事件和事件ID才知道的

代码例子稍后分享,上传后还拿不到链接地址。

代码链接:工程源代码链接

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-20 15:14:29  更:2021-08-20 15:15:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:46:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码