2012-12-08 2 views
2

나는 커서를 사용하여 가로 스 와이프를하려고하는데, 나는 단지 grokking하지 않고, 여기 누군가가 나를 이해하도록 도울 수있다.다른 활동으로 커서를 이동해도 안전합니까?

항목 목록을 보여주는 활동이 있습니다. 사용자 지정 CursorAdapter에 의해 지원되는 ListView을 사용하고 해당 어댑터는 LoaderCallback에 의해 관리됩니다. 이것은 모두 표준적인 것입니다.

사용자가 목록에서 항목을 클릭하면 해당 항목에 대한 자세한 정보를 표시하려고합니다. 현재 선택한 항목의 ID를 전달하여 새로운 활동을 시작합니다. 이 활동은 데이터베이스에서 항목에 대한 정보를로드합니다. 다시 표준 물건.

이제 항목 목록 사이를 오가며 항목을 클릭하면 해당 항목에 대한 자세한 정보가 표시됩니다. 최상의 사용자 환경이 아니므로 사용자가 정보를 표시하기 위해 항목을 클릭하도록 허용하는 것이 좋습니다 목록에서 다음 또는 이전 항목에 대한 세부 정보를 스 와이프 할 수 있습니다.

그래서 내가 ListView에서 항목을 클릭하면 ViewPager을 포함하는 활동을 시작해야한다고 가정합니다. 이 ViewPager은 적절한 위치에서 뷰를 가져 오는 PagerAdapter에 의해 지원됩니다.

목록 활동에 사용 된 CursorAdapter을 세부 활동으로 전달한 다음을 구현하여보기 호출기의 현재 항목에 대한 세부 정보를 표시하는 커서를 트래버스합니다. 이 간단한데 : getItem(pos)는 등, 커서에서 조각을 만들 cursor.moveToPosition(pos)을 부를 것이다

그러나 (1) 나는 그것을 할 수 있다고 생각하지 않기 때문에, 활동에 CursorAdapter을 전달하는 방법을 잘 모르겠어요 (2) 라이프 사이클을 관리하기 위해 첨부 된 LoaderCallbacks이 없으므로 어쨌든 CursorAdapter를 다른 액티비티로 전달하는 것을 주저합니다.

가능한 한 가지 해결책은 새 활동을 시작하고 해당 활동이 새 활동을 수행하여 목록 활동에있는 커서와 동일한? 서를 얻는 것입니다. 예를 들어 목록 활동은 "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

그래서 새로운 활동에서 새 쿼리를 생성하기로했습니다. 그것은 동일한 수색을 두 번 수행하기 위해 저를 귀찮게하지만 다른 안전한 방법은 없습니다. –

관련 문제