2010-06-14 1 views
1

SimpleCursorAdapter에서 만든 EditText 항목의 스크롤 목록이 길고 SQLite 데이터베이스에서 값이 미리 채워져 있습니다.스크롤 목록의 EditText 항목은 화면에서 스크롤 할 때 변경 사항을 잃습니다.

내가 이것을합니다

cursor = db.rawQuery("SELECT _id, criterion, localweight, globalweight FROM " + dbTableName + " ORDER BY criterion", null); 

startManagingCursor(cursor); 

mAdapter = new SimpleCursorAdapter(this, R.layout.weight_edit_items, cursor, new String[]{"criterion","localweight","globalweight"}, new int[]{R.id.criterion_edit, R.id.localweight_edit, R.id.globalweight_edit});  

this.setListAdapter(mAdapter); 

스크롤 목록은 여러 에뮬레이터 화면 깁니다. 항목이 확인을 표시합니다. - 항목을 스크롤하면 각 항목이 데이터베이스에서 올바른 값을가집니다.

편집 텍스트를 편집 할 수 있으며 새 텍스트가 허용되고 상자에 표시됩니다.

하지만 편집 된 항목을 화면에서 꺼내기에 충분할 정도로 목록을 스크롤하면 다시 스크롤하여 값을 변경 한 후에 변경된 값으로 되돌립니다. 내 편집 내용이 손실되었습니다. 이 분류하는 시도에서

, 나는 심지어 글고하지만, 내 편집을 수행 (및 스크롤 전) 및 gettext에이 원래 텍스트를 반환 한 후 글고에서 무엇을 볼 수있는 gettext에 했어 내 텍스트가 표시됩니다. EditText는 내 편집 만 표면적으로 받아 들였고 EditText에 바인딩되지 않은 것 같습니다. 즉, 화면 밖으로 스크롤 할 때 삭제됩니다.

아무도 내가 여기에 무슨 일이 일어나고 편집 편집을 유지하기 위해 내가해야 할 일을 말해 줄 수 있습니까?

감사

이안

답변

3

하지만 ... 다음 목록을 스크롤하면 훨씬 내가 다시 에 그것을보고 다시 스크롤 할 때 화면 밖으로 편집 항목을 정도로 그 값이 으로 변경되기 전의 값은 입니다. 내 편집 내용이 손실되었습니다.

물론.

목록 행을 재활용합니다. Cursor에는 1,000 개의 레코드가있을 수 있지만 목록을 스크롤하면 1,000 개의 EditText 위젯이 생성되지 않습니다. 오히려 얼마나 많은 행이 동시에 표시되는지에 따라 10 정도가 될 것입니다. 행은 재활용되고 바인드 작업은 화면에 스크롤 된 행에 대해 이전 EditText 값을 Cursor의 새 값으로 바꿉니다. 이전 값 (데이터베이스의 이전 값 또는 사용자 편집 값)을 바꿉니다.

그리고 일반 Cursor은 변경할 수 없기 때문에 투명하게 목록에 다시 넣을 수있는 방법으로 편집 내용을 유지할 방법이 없습니다.

EditTexts 행을 사용하여 ListView을 만들 수 있습니다. 아마도 사용자 정의 Adapter 클래스를 만들고 자신을 재활용하는 모든 행을 처리해야합니다. 그러나 이것은 상당한 양의 작업이 될 것이며 내장 클래스는이 패턴에 대한 지원 만 제공합니다.

+0

정말 좋은 답변을 주셔서 감사합니다. (불행히도 나를 위해!) 나는 몇 가지 행 재활용을 생각해 내 기본 디자인을 다시 생각해 봐야 할 것입니다. – ianww

관련 문제