2010-11-16 12 views
48

Il mio libro, "Ciao Android" dà questo come un modo di usare un aiutante db personalizzato, la creazione di un cursore, e quindi la creazione di un adattatore come segue:Modo migliore per Refresh adattatore/ListView su Android

Cursor cursor 
CustomDatabaseHelper test = new CustomDatabaseHelper(this); 
try { 
     cursor = getData(); 
     showData(cursor); 
} finally { 
     test.close(); 
} 

Con questo tuttavia, ogni volta che ho bisogno di aggiornare il set di dati, devo continuare a eseguire questo blocco di codice (che diventa un po 'difficile all'interno di un onClick() per un pulsante a causa di "questo" non disponibile

È questo il modo migliore per aggiornare il set di dati, o dovrei cercare di rimuovere il .close e rilasciare un adapter.notifyDataSetChanged()? Se faccio questo, a volte ho una forza chiusa come (e non posso ricorda al momento), ma a volte non può eliminare correttamente - penso che questo potrebbe essere dovuto al fatto che il database è attualmente aperto e tenta di aprirsi di nuovo.

Dovremmo anche dichiarare le variabili per Cursori, DatabaseHelpers e Adapter nella Classe (al di fuori di OnCreate) in modo che siano accessibili a tutte le funzioni?

Mi rendo conto che in questa fase si tratta solo di una programmazione scadente, ma sto cercando di ottenere alcune indicazioni sul modo migliore di fare le cose.

+0

Solo un sidenote: Le cose sono un po 'diverso se si utilizzano i fornitori di contenuti e LoaderManager. Vedi: http://stackoverflow.com/a/19657500/1087411 – Anderson

risposta

81

È necessario utilizzare adapter.notifyDataSetChanged(). Che cosa dice il registro quando lo usi?

+1

Grazie Macarse, che funziona, ma solo se non faccio un .close sull'helper del database. Penso anche a cosa succede se non faccio il .close, il sistema cerca di aprire troppi database e cade. Il database dovrebbe essere aperto lungo tutto il ciclo di vita dell'attività? – Simon

+0

È necessario utilizzare http://developer.android.com/reference/android/app/Activity.html#startManagingCursor(android.database.Cursor) per gestire il cursore all'interno di un'attività. – Macarse

9

Seguendo codice funziona perfetto per me

EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter(); 
adp.UpdateDataList(EfficientAdapter.MY_DATA); 
adp.notifyDataSetChanged(); 
QuickList.invalidateViews(); 
QuickList.scrollBy(0, 0); 
+1

Chiamare notifyDataSetChanged() non era sufficiente per me. invalidateViews() funziona invece. –

16

Basta aggiungere questi codice prima di Adapter sta funzionando per me:

listView.destroyDrawingCache(); 
    listView.setVisibility(ListView.INVISIBLE); 
    listView.setVisibility(ListView.VISIBLE); 

o direttamente si può usare sotto metodo dopo risorsa modifica dei dati.

adapter.notifyDataSetChanged() 
+1

Ciò vale anche per i pulsanti: \t \t // Forza aggiornamento \t \t myButton.setVisibility (Button.INVISIBLE); \t \t myButton.setVisibility (Button.VISIBLE); – hornetbzz

+1

per quale scopo devi aggiornare il tuo pulsante? – sravan

+0

dopo un filtro e quindi viene applicato il suo contrario. – hornetbzz

0

Se si utilizza LoaderManager provare con questa affermazione:

getLoaderManager().restartLoader(0, null, this); 
-2

basta scrivere nel vostro ArrayAdaper personalizzato di questo codice:

public void swapItems(ArrayList<Item> arrayList) { 
    this.clear(); 
    this.addAll(arrayList); 
} 
0
adapter.notifyDataSetChanged(); 
+0

Si prega di modificare con ulteriori informazioni. Le risposte solo per codice e "prova questo" sono scoraggiate, perché non contengono contenuti ricercabili e non spiegano perché qualcuno dovrebbe "provare questo". – abarisone

+0

sulla ricerca si desidera aggiornare la scheda? –

0

Forse il loro problema è il momento in cui la ricerca viene effettuata nel database. Nei suoi cicli Frammento Override del suo Fragment.java di capire solo: provare il test con i metodi:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_x, container, false); //Your query and ListView code probably will be here 
    Log.i("FragmentX", "Step OnCreateView");// Try with it 
    return rootView; 
} 

Prova ora simile messo Log.i ... "onStart" e "onResume".

infine tagliare il codice in "onCreate" e metterlo in "onStart", per esempio:

@Override 
public void onStart(){ 
    super.onStart(); 
    Log.i("FragmentX","Step OnStart"); 
    dbManager = new DBManager(getContext()); 
    Cursor cursor = dbManager.getAllNames(); 
    listView = (ListView)getView().findViewById(R.id.lvNames); 
    adapter = new CustomCursorAdapter(getContext(),cursor,0);// your adapter 
    adapter.notifyDataSetChanged(); 
    listView.setAdapter(adapter); 
} 
0

Basta scrivere nella vostra abitudine ArrayAdaper questo codice:

private List<Cart_items> customListviewList ; 

refreshEvents(carts); 

public void refreshEvents(List<Cart_items> events) 
{ 
    this.customListviewList.clear(); 
    this.customListviewList.addAll(events); 
    notifyDataSetChanged(); 
} 
5

modo migliore per Aggiorna adattatore/ListView su Android

Non solo chiamando notifyDataSetChanged() sarà aggiornare i dati ListView, setAdapter() deve essere chiamato prima per caricare correttamente le informazioni:

listView.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
Problemi correlati