我正在尝试刷新使用创建为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的方法都没有。
答案 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;