Atualiza SimpleCursorAdapter enquanto mantém a posição de rolagem em ListView

9

Meu problema: Meu ListView redefine sua posição de rolagem para o topo sempre que eu atualizar seu conteúdo através de seu (personalizado) SimpleCursorAdapter. Eu gostaria que o ListView para manter sua posição de rolagem quando atualizado.

Comecei criando uma nova instância de adaptador todas as vezes e usando ListView.setAdapter() , mas de acordo com esta discussão Eu deveria estar atualizando o adaptador em vez de redefini-lo. Eu não consigo encontrar uma maneira de fazer isso para SimpleCursorAdapter que funciona corretamente.

Aqui estão algumas coisas que eu tentei, omitindo os argumentos do método:
- SimpleCursorAdapter.changeCursorAndColumns() com um cursor novo atualiza com êxito o adaptador, mas ainda redefine a posição de rolagem.
- SimpleCursorAdapter.changeCursor() age da mesma maneira.
- SimpleCursorAdapter.swapCursor() não está disponível até a api 11, e estou desenvolvendo para api 8.
- SimpleCursorAdapter.notifyDataSetChanged() não atualiza o ListView. (Talvez haja outro passo que eu esteja perdendo). - ListView.invalidate() não atualiza o ListView.
- SimpleCursorAdapter.requery() torna o ListView em branco e é obsoleto.
- Estou familiarizado com a solução ListView.setSelection() , mas não quero que meu ListView seja movido quando for atualizado. Isso se encaixa em uma posição na lista.

Isto parece que deveria ser um problema comum e simples. Alguém já lidou com isso?

    
por pvans 13.02.2012 в 06:07
fonte

2 respostas

5

Eu tive um problema semelhante: Meu CursorAdapter redefinir a posição de rolagem sempre que o conteúdo do cursor mudou.

Eu não percebi que realmente defini um novo adaptador de lista toda vez que os dados eram alterados. Eu pensei que o próprio cursor iria notificar o adaptador sobre as alterações ao seu conteúdo, mas no meu caso é o ContentProvider que aciona LoaderManager.LoaderCallbacks.onLoadFinished () no meu ListFragment. Nesse retorno de chamada, agora uso o CursorAdapter.changeCursor () em vez de criar um novo adaptador e tudo funciona bem.

Espero que isso ajude a solucionar seu problema.

    
por Oderik 22.02.2012 / 21:01
fonte
0

Fiz o mesmo no post execute do Async Task usado seguindo código trabalhado por mim

 Cursor cursor = mDataHelper.getWritableDatabase().query(
                        DataContract.Incares.TABLE_NAME,  // Table to Query
                        null, // all columns
                        null, // Columns for the "where" clause
                        null, // Values for the "where" clause
                        null, // columns to group by
                        null, // columns to filter by row groups
                        DataContract.Incares.UUID +" DESC" // sort order
                );
CursorAdapter.swapCursor(cursor);
CursorAdapter.notifyDataSetChanged();

com o CursorAdapter sendo uma variável global

    
por Amandeep Singh 20.07.2015 / 00:16
fonte