Your event handler looks really odd (and dangerous and slow) to me. When an item is clicked you first set the currently checked item as the selected item. This seems OK.
Then you unhook your event handler from the UI. Why do you do this?
Next you get the selected item. Unless you have multi-select enabled then wouldn't that be the item that is currently being checked/unchecked?
Then you try to move the item to the top or bottom by moving items around. To do that you doing a BeginUpdate/EndUpdate call but in the middle of that you're refreshing the item at index 0 (for both the top and bottom which seems wrong). Why are you doing this? The EndUpdate should cause the UI to refresh already. You shouldn't need to do that yourself.
As part of this you're rebuilding the subitems for all the items in the list. This seems redundant and wasteful. The UI should already handle refreshing the items and assuming you've configured the ListViewItem to have the correct subitems to begin with then moving a ListViewItem around in the list shouldn't require that you manually rebuild anything. It seems like all this code can go. I don't even think you need a LIstViewItemEx type as you could just wrap your data in a simple data wrapper but there may be more going on here then I can see.
After the move you set the selected item again but it seems like it might be selecting the wrong index. It seems like it should either select the first or last item or, even better, not have to do anything if you just moved the items around.
Finally it restores the event handler. Again, you shouldn't need to unhook and rehook the event handler up again.