在运行时更改 ListView 项目图像(firemonkey)
change ListView item image at runtime (firemonkey)
我需要用户能够独立于单击项目来按下和设置 ListView 项目的复选框。如果他们按下复选框,我将 add/remove 勾选并采取一些行动。如果他们按下项目文本,我可以采取其他行动。
我可以用 ListBox 做到这一点,内置功能没有问题。我不知道如何使用 ListView 来完成它。它是怎么做到的?
我可以将以下代码放在 ListView1ItemClickEx 中以了解用户何时单击图像。也许我可以将图像更改为复选标记?
if (ItemObject->Name == "I") {
ShowMessage("Item Image clicked");
}
但我不知道如何在运行时更改特定项目图像(例如,我可以在选中标记图像和未选中图像之间切换)。
下图是为了清楚起见。单击红色框中的任意位置将更改项目复选框。对于 ListBox,单击蓝色框中的任意位置将触发 OnClick 事件并且不会更改复选框。我希望在 ListView 中有相同的行为。
好的,Remy 回答了 this related question,这帮助我解决了这个问题。现在我可以使 ListView 具有一个功能类似于 ListBox 的复选框。我通过在用户按下(或单击)项目的图像区域时切换项目图像来实现。
当用户单击项目图像时,我会捕获它(根据 Remy 在 ListView1ItemClickEx 事件中的代码)并在引用 ItemIndex 的向量中从 0->1 或 1->0 切换它(例如 myVector[ItemIndex] = 0) 然后我完全重建 ListView (清除它并从头开始构建)。
我想我必须记住我在列表中向下滚动到的位置,并且在刷新 ListView 后我必须在代码中滚动到那个点 - 但事实并非如此。我不知道为什么,但在刷新后我仍然在列表中单击项目图像的位置。它使它的工作和感觉完全像一个复选框。
在 iOS、Android 和 Windows 中效果很好。
p.s。我忘了提及您需要将任何 Header 视为您向量中的项目,并与每个项目的图像(0 或 1)保持一致。否则添加 headers 会使您失去同步,并且单击一个项目的图像将切换其他项目的图像。
我需要用户能够独立于单击项目来按下和设置 ListView 项目的复选框。如果他们按下复选框,我将 add/remove 勾选并采取一些行动。如果他们按下项目文本,我可以采取其他行动。
我可以用 ListBox 做到这一点,内置功能没有问题。我不知道如何使用 ListView 来完成它。它是怎么做到的?
我可以将以下代码放在 ListView1ItemClickEx 中以了解用户何时单击图像。也许我可以将图像更改为复选标记?
if (ItemObject->Name == "I") {
ShowMessage("Item Image clicked");
}
但我不知道如何在运行时更改特定项目图像(例如,我可以在选中标记图像和未选中图像之间切换)。
下图是为了清楚起见。单击红色框中的任意位置将更改项目复选框。对于 ListBox,单击蓝色框中的任意位置将触发 OnClick 事件并且不会更改复选框。我希望在 ListView 中有相同的行为。
好的,Remy 回答了 this related question,这帮助我解决了这个问题。现在我可以使 ListView 具有一个功能类似于 ListBox 的复选框。我通过在用户按下(或单击)项目的图像区域时切换项目图像来实现。
当用户单击项目图像时,我会捕获它(根据 Remy 在 ListView1ItemClickEx 事件中的代码)并在引用 ItemIndex 的向量中从 0->1 或 1->0 切换它(例如 myVector[ItemIndex] = 0) 然后我完全重建 ListView (清除它并从头开始构建)。
我想我必须记住我在列表中向下滚动到的位置,并且在刷新 ListView 后我必须在代码中滚动到那个点 - 但事实并非如此。我不知道为什么,但在刷新后我仍然在列表中单击项目图像的位置。它使它的工作和感觉完全像一个复选框。
在 iOS、Android 和 Windows 中效果很好。
p.s。我忘了提及您需要将任何 Header 视为您向量中的项目,并与每个项目的图像(0 或 1)保持一致。否则添加 headers 会使您失去同步,并且单击一个项目的图像将切换其他项目的图像。