有朋友的项目需要响应列表项点击事件,同时又需要响应列表项中的按钮的点击事件。由于列表项点击事件是作用于整个列表项的,因此按钮的点击事件也会触发列表项点击事件。
如何实现点击按钮时不触发列表项点击事件呢?
方法其它很简单,界面效果如下:
点击列表中的删除按钮,不触发列表项点击事件。
adapter代码如下:
[C++] 纯文本查看 复制代码 virtual void getView(int position, SWindow* pItem, pugi::xml_node xmlTemplate)
{
if (pItem->GetChildrenCount() == 0)
{
pItem->InitFromXml(xmlTemplate);
}
FieldInfo psi = m_vecFieldInfo.at(position);
pItem->FindChildByName(L"txt_id")->SetWindowText(SStringT().Format(_T("%d"), position + 1));
pItem->FindChildByName(L"txt_fieldName")->SetWindowText(psi.szFieldName);
if (psi.iType == 0)
{
pItem->FindChildByName(L"txt_content")->SetWindowText(psi.szText);
pItem->FindChildByName(L"txt_type")->SetWindowText(_T("文本"));
}
else if (psi.iType == 1)
{
pItem->FindChildByName(L"txt_content")->SetWindowText(psi.szPicPath);
pItem->FindChildByName(L"txt_type")->SetWindowText(_T("图片"));
}
else
{
pItem->FindChildByName(L"txt_type")->SetWindowText(_T("未知字段类型"));
}
SButton* pBtnDelete = pItem->FindChildByName2<SButton>(L"btnDelete");
pBtnDelete->SetUserData(position);
pBtnDelete->GetEventSet()->subscribeEvent(EVT_CMD, Subscriber(&CTestMcAdapterFix::OnButtonClickDelete, this));
pItem->SetUserData(position);
pItem->GetEventSet()->subscribeEvent(EventItemPanelClick::EventID, Subscriber(&CTestMcAdapterFix::OnItemClick, this));
}
bool OnButtonClickDelete(EventArgs* pEvt)
{
SButton* pBtn = sobj_cast<SButton>(pEvt->sender);
int iItem = pBtn->GetUserData();
if (SMessageBox(NULL, SStringT().Format(_T("确定删除该字段吗"), iItem), _T("删除确认"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
{
//删除一条记录
DeleteItem(iItem);
}
SLOG_INFO("on delete click");
return true;
}
bool OnItemClick(EventArgs* pEvt)
{
SItemPanel* pItem = sobj_cast<SItemPanel>(pEvt->sender);
int iItem = pItem->GetUserData();
EventItemPanelClick* e2 = sobj_cast<EventItemPanelClick>(pEvt);
CPoint pt(GET_X_LPARAM(e2->lParam), GET_Y_LPARAM(e2->lParam));
SWND swnd = pItem->SwndFromPoint(pt);
SWindow* pClick = SWindowMgr::GetWindow(swnd);
if (pClick->GetID() != R.id.btnDelete)
{
SLOG_INFO("on item click");
}
return true;
}
关键在于OnItemClick的时候,通过EventItemPanelClick.lParam判断出点击位置即可。
完整代码见附件。
PrinterTools.zip
(75 KB, 下载次数: 3, 售价: 2 SOUI币)
|