2012-04-14 15 views
0

私は、SQLとアダプタを組み合わせたアプリケーションを開発中です。主な問題は、データベースを更新すると、アダプターに自分の更新が直接反映されないことです。あなたが見ることができるように、このコードは行Cursor cursor = dbAdaptor.getRssItems(channelid);(取得RssItemsだけのデータをロードしている私たちはSQLから画面上に提示したい)でSQLからデータを取得アダプターをアクティビティー用に動的に更新する方法は?

public class RSSItemActivity extends ListActivity { 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.rssitem); 

     long channelid = getIntent().getExtras().getLong(RSSReaderApp.CHANNEL_KEY); 
     DBAdaptor dbAdaptor = ((RSSReaderApp)getApplication()).getDBAdaptor(); 
     Cursor cursor = dbAdaptor.getRssItems(channelid); 

     adapter = new RSSItemAdapter(this, R.layout.rssitemview, cursor); 

     setListAdapter(adapter); 
} 

:ここでは、コードです。しかし、私は同じアクティビティにいくつかのボトムを持っています。これを押すと、SQLの値が変更され、取得するデータに影響します。 (たとえば、これらのアイテムの色は何かを決める列がありますが、最初は白に設定されていますが、それを押すと青色になります)。実際のプレゼンテーションはまだ同じ色です。私は、ボタンを押すたびにカーソルを更新するために底面にadapter.swapCursor(dbAdapter.getRssItems(id));を使用してみましたが、元のディスプレイが消えてしまいます(元のアダプタがカーソルを失って何も表示しない可能性があるため)。正しい出力を得る。即座に出力を更新できる方法はありますか?事前にお返事ありがとう=)

答えて

1

アダプタのカーソルを更新する必要があります。次の操作を呼び出すことができます。

// Closes the old cursor as well. 
adapter.changeCursor(dbAdapter.getRssItems(id)); 
// Notify the view that the underlying data has changed. 
adapter.notifyDataSetChanged(); 

また、swapCursor(との差)をswapCursorはそうではないchangeCursorは、自動的に、古いカーソルをクローズしていることです。

+0

おかげで、私はちょうど結果は奇妙になって、最初の数回のために働くだろうと思われる、ことを試してみました。(私はまだいくつかクリックした後、出力を失いました)私が実際にやる方法は、新しい意図を開いて新しいものを表示することです。私がリストに戻ったとき、初めて動作しますが、別のページへのリンクを押して戻ってくると、それはちょうど壊れています。少し奇妙だが、まだ感謝 – JLTChiu

+0

onResume()(およびonPause())をオーバーライドしましたか?インテントで新しいアクティビティをアクティビティすると、現在のアクティビティが一時停止して状態が失われます。 onResume()では、データベースから再度データをロードすることができます。 – dennisg

+0

私はそれをしなかったので、私はonResume()をオーバーライドして、データを再度ロードするように頼むべきですか?毎回このページに戻ってくるので、結果が最も更新されていることを確認できますか? – JLTChiu

0

はこれを試して...

runOnUiThread(returnResult); 


private Runnable returnResult = new Runnable() { 

    @Override 
    public void run() { 
     if(array_list.size() > 0) 
     { 
      m_adapter.notifyDataSetChanged(); 
      for(int i=0;i<array_list.size();i++) 
       m_adapter.add(array_list.get(i)); 
     } 
     m_adapter.notifyDataSetChanged(); 

    } 
    }; 
関連する問題