2012-12-08 78 views
2

我正在嘗試使用遊標進行水平滑動,但我只是沒有注意什麼,希望這裏有人能幫助我理解。將光標傳遞給其他活動安全嗎?

我有一個顯示項目列表的活動。它使用一個ListView,它由一個自定義CursorAdapter支持,該適配器由LoaderCallback管理。這是所有標準的東西。

當用戶在列表中點擊一個項目,我想顯示有關該項目的詳細信息。目前我開始一項新活動,傳遞所選項目的ID。此活動將從數據庫加載有關該項目的信息。再次,標準的東西。

現在,來回的項目列表之間並單擊某個項目,以顯示更詳細的有關該項目是不是最好的用戶體驗,這將是最好允許用戶點擊一個項目以顯示其信息,然後允許滑動以顯示列表中下一個或上一個項目的詳細信息。

所以我假設當在ListView中點擊一個項目時,我需要啓動一個包含ViewPager的活動。此ViewPager由PagerAdapter支持,它負責在適當的位置提取視圖。

所以我想通過列表中的活動細節活動中使用的CursorAdapter,然後實施PagerAdapter橫穿光標顯示視圖尋呼機當前項目的細節。這似乎很簡單:getItem(pos)會叫cursor.moveToPosition(pos)然後創建從遊標片段等

但(1)我不知道如何將CursorAdapter傳遞給一個活動,因爲我不認爲它可以(2)我很猶豫是否將CursorAdapter傳遞給另一個活動,因爲沒有附加LoaderCallbacks來管理生命週期。

一個可行的辦法是啓動新的活動,有活動執行新的搜索,獲得同等光標在列表中找到活動光標。例如,列表活動可能顯示了匹配「title = foo」的項目,所以當單擊項目10時,我們創建一個新的細節活動,顯示關於項目10的信息,還執行「title = foo」搜索以獲得可用於水平滑動的光標。但這意味着我正在執行相同的搜索兩次:一次在列表視圖中,一次在分頁視圖中。如果搜索需要一些時間,這可能是一個問題。

我也可以存儲在一些全局靜態區光標(如Application),但似乎充滿風險爲好。

還有Parcelable但我認爲,這意味着我序列化一側光標和反序列化它的另一面。對於大型列表,再次執行搜索以獲取新的遊標可能更有效。

我敢肯定,這是一個常見的場景,所以我想知道什麼是跨多個活動遊標管理最佳實踐,或者一些其他的方法可能會更好。

+0

難道你不能創建一個數據庫來支持你的列表項並將索引傳遞給信息活動嗎?或者在列表視圖頂部創建一個隱藏視圖,以顯示所選項目的信息,並在用戶想要返回列表視圖時將其隱藏。 – Rawr

+0

感謝您的評論。您對在現有活動中現有列表視圖頂部創建詳細視圖的建議感興趣。根本不使用單獨的活動。我假設這裏將從'onListItemClicked'處理程序的佈局中移除列表視圖,然後將'ViewPager'添加到佈局中。棘手的問題將是處理後退按鈕以返回到原始列表視圖,以及在細節視圖與列表視圖(使用片段)並存時橫屏模式下該做什麼。但我會給這個更多的想法。 –

+0

另外我正在使用一個數據庫;如果使用單獨的詳細活動,則一個選項(我已經建議)將再次執行相同的搜索,並根據列表項的位置調用'cursor.moveToPosition()'。我不喜歡這個選項,因爲這意味着執行兩次相同的搜索並出現相關的性能問題。 –

回答

2

不,請不要將任何光標或光標適配器或類似的東西傳遞給其他活動。在這個過程的某個層次上,你必須通過活動的context才能創建對象。如果該對象以某種方式使用他人的上下文進入另一個活動,事情可能會變得瘋狂。

此外,我不明白你爲什麼需要適配器本身。難道你沒有辦法只用光標(重新實例化)你的新活動的同一個光標,通過點擊的位置並使你的PagerAdapter,然後預先選擇你想查看的細節位置?就像你說的,但你不需要一個新的搜索,通過position的意圖。

+0

感謝您的評論。我有點認爲在活動之間傳遞遊標是一個壞主意,這就是爲什麼我不喜歡這樣做並尋求建議。我認爲你在這裏建議的是在新的活動中生成一個新的遊標,然後根據所點擊的列表項的位置移動該遊標?但我不確定如何在不執行其他搜索的情況下在新的活動中創建新的遊標。 –

+0

好的,你必須執行查詢。但是一個查詢不會是你需要的最耗費資源的步驟。你只需要查詢加載你的'pageAdapter',然後根據單擊項目的位置移動* pageAdapter *。 – mango

+0

所以我選擇在新的活動中生成一個新的查詢。這讓我很難執行相同的搜索兩次,但我沒有看到其他安全的方式。 –

相關問題