如何动态更新适配器的活动?

时间:2012-04-14 19:43:43

标签: java android adapter

我正在开发一个结合了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);
}

正如您所看到的,此代码从Cursor cursor = dbAdaptor.getRssItems(channelid);行的SQL获取数据(get RssItems只是加载我们希望在SQL屏幕上显示的数据)。但是,我在同一个活动中有一些底部,如果按下它,它将更改SQL中的值,这应该影响它检索的数据。 (例如,有一列确定这些项目的颜色是什么,它最初设置为白色,在我按下它之后,它应该是蓝色。)但是,一旦我按下它,看起来虽然SQL中的数据被更改了,但是真实的演示文稿仍然是相同的颜色。我曾尝试在底部使用adapter.swapCursor(dbAdapter.getRssItems(id));来每次按下按钮时更新光标,但它会让我的原始显示消失(可能是因为原始适配器丢失了它的光标,所以它什么也没显示),我必须重新加载该页面以获得正确的输出。有没有办法可以立即更新输出?感谢您提前回复=)

2 个答案:

答案 0 :(得分: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则不会。

答案 1 :(得分: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();

    }
  };