0

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からデータを取得しますCursor cursor = dbAdaptor.getRssItems(channelid);(get RssItemsは、SQLから画面に表示するデータをロードしているだけです)。ただし、同じアクティビティにいくつかのボトムスがあり、それを押すとSQLの値が変更され、取得するデータに影響を与えるはずです。(たとえば、これらのアイテムの色を決定する列があります。元々は白に設定されていて、それを押すと青になります。)ただし、これを押すと、SQLのデータは変更されているように見えますが、実際のプレゼンテーションはまだ同じ色です。使ってみましたadapter.swapCursor(dbAdapter.getRssItems(id));下部にあるボタンを押すたびにカーソルを更新しますが、元の表示が消えます(おそらく、元のアダプターがカーソルを失ったため、何も表示できません)。正しい出力を得るには、そのページをリロードする必要があります。出力を即座に更新する方法はありますか?よろしくお願いします=)

4

2 に答える 2

1

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

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

また、swapCursor()との違いは、changeCursorが古いカーソルを自動的に閉じるのに対し、swapCursorは閉じないことです。

于 2012-04-14T19:51:15.613 に答える
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();

    }
  };
于 2012-04-14T20:22:59.873 に答える