Atualizar um SimpleCursorAdapter após executar o trabalho em um thread que não seja da interface do usuário
Estou tentando chamar .notifyDataSetChange () em um SimpleCursorAdapter exibido em um ListView a partir de um thread que não seja de interface do usuário para análise de XML e não consigo descobrir como. Pesquisei por toda parte e encontrei artigos que falam sobre a atualização a partir do próprio ListView, o que não estou fazendo. Não consigo descobrir uma maneira de passar o adaptador ou obtê-lo dos pais ou o que for necessário para chamar um método nele de outro encadeamento.
O ListView será atualizado na próxima vez que iniciar a atividade, mas quero que ele seja atualizado assim que a análise XML for concluída, para que o usuário veja os novos dados imediatamente.
A resposta é provavelmente simples; está apenas me iludindo. Agradecemos antecipadamente por qualquer ajuda!
Aqui está o meu código:
public class DirectoryListActivity extends DirectoryActivity {
public final Handler mHandler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.directory_list);
// Populate the ListView
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables(
directoryPeople.PEOPLE_TABLE
);
String asColumnsToReturn[] = {
//snip
};
mCursor = queryBuilder.query(mDB, asColumnsToReturn, null, null,
null, null, directoryPeople.DEFAULT_SORT_ORDER);
startManagingCursor(mCursor);
// HERE'S THE ADAPTER
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.directory_people_item, mCursor,
new String[]{
//snip
new int[]{
//snip
);
ListView av = (ListView)findViewById(R.id.listPeople);
av.setAdapter(adapter);
//Perform sync in background
startXMLParseThread();
}
public void startXMLParseThread() {
new Thread () {
boolean success = false;
public void run() {
try {
// XML-Parsing and Table-Updating code
} catch (Exception e) {
success = false;
}
mHandler.post(new Runnable() {
public void run() {
TextView txtUpdateStatus = (TextView)findViewById(R.id.txtUpdateStatus);
if (success) {
txtUpdateStatus.setText(R.string.synced);
} else {
txtUpdateStatus.setText(R.string.sync_failed);
}
adapter.notifyDataSetChanged(); // ECLIPSE HATES
}
});
}
}.start();
}
}
}