android:使用ListAdapter和SimpleCursorAdapter刷新ListView

时间:2011-02-25 03:09:37

标签: android listview refresh listadapter simplecursoradapter

我正在尝试刷新使用创建为SimpleCursorAdapter的ListAdapter的ListView。

这是我在onCreate中创建Cursor和ListAdapter的代码,它填充了ListView。

tCursor = db.getAllEntries();       

ListAdapter adapter=new SimpleCursorAdapter(this,
                R.layout.row, tCursor,
                new String[] columns,
                new int[] {R.id.rowid, R.id.date});

setListAdapter(adapter);

然后,我在另一个方法中向db添加了一些数据,但我无法弄清楚如何刷新ListView。 stackoverflow和其他地方的类似问题提到使用notifyDataSetChanged()和requery(),但ListAdapter或SimpleCursorAdapter的方法都没有。

4 个答案:

答案 0 :(得分:5)

我可以通过创建新的适配器并再次调用setListAdapter来刷新ListView。

我在另一个方法中将它命名为adapter2。

tCursor = db.updateQuery();       

ListAdapter adapter2=new SimpleCursorAdapter(this,
                R.layout.row, tCursor,
                columns,
                new int[] {R.id.rowid, R.id.date});

setListAdapter(adapter2);

我不确定为什么这是必要的,但它现在有效。如果有人有更好的解决方案,我愿意尝试。

答案 1 :(得分:0)

在这种情况下,我建议您通过扩展Adapter课程来使用自定义BaseAdapter

答案 2 :(得分:0)

方法notifyDataSetChanged来自SimpleCursorAdapter父类BaseAdapter。父级实现ListAdapter,您应该能够将其传递给ListView

尝试:

tCursor = db.getAllEntries();       

BaseAdapter adapter=new SimpleCursorAdapter(this,
            R.layout.row, tCursor,
            new String[] columns,
            new int[] {R.id.rowid, R.id.date});

setListAdapter(adapter);


然后你应该可以使用notifyDataSetChanged

答案 3 :(得分:0)

如果需要从同一个类中的其他方法访问适配器,则可以将该适配器定义为类变量。然后,您可以调用changeCursor()来刷新ListView。

public class mainActivity extends AppCompatActivity {
    // Define the Cursor variable here so it can be accessed from the entire class.
    private SimpleCursorAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_coordinator_layout)

        // Get the initial cursor
        Cursor tCursor = db.getAllEntries();       

        // Setup the SimpleCursorAdapter.
        adapter = new SimpleCursorAdapter(this,
            R.layout.row,
            tCursor,
            new String[] { "column1", "column2" },
            new int[] { R.id.rowid, R.id.date },
            CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

        // Populate the ListAdapter.
        setListAdapter(adapter);
    }

    protected void updateListView() {
        // Get an updated cursor with any changes to the database.
        Cursor updatedCursor = db.getAllEntries();

        // Update the ListAdapter.
        adapter.changeCursor(updatedCursor);
    }
}

如果需要从另一个类的方法更新列表视图,则应该声明适配器变量public static

public static SimpleCursorAdapter adapter;