我创建了一个列表视图,数据取自sqlite现在我想让它将使用单选按钮按名称或位置排序
这是我的代码
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
db = new DatabaseHelper(this);
RadioButton rbname = (RadioButton)findViewById(R.id.radio0);
RadioButton rblocation = (RadioButton)findViewById(R.id.radio1);
if (rbname.isChecked()){
Cursor = db
.getReadableDatabase()
.rawQuery("SELECT * FROM " + DatabaseHelper.LIST + " ORDER BY " + DatabaseHelper.NAME, null);
ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.row, Cursor,
new String[] {DatabaseHelper.NAME, DatabaseHelper.ADDRESS, DatabaseHelper.GENDER, DatabaseHelper.LOCATION},
new int[] {R.id.txtName, R.id.txtAddress, R.id.txtGender, R.id.txtLocation});
setListAdapter(adapter);
}
else if (rblocation.isChecked()){
Cursor = db
.getReadableDatabase()
.rawQuery("SELECT * FROM " + DatabaseHelper.LIST+ " ORDER BY " + DatabaseHelper.LOCATION, null);
ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.row, Cursor,
new String[] {DatabaseHelper.NAME, DatabaseHelper.ADDRESS, DatabaseHelper.GENDER, DatabaseHelper.LOCATION},
new int[] {R.id.txtName, R.id.txtAddress, R.id.txtGender, R.id.txtLocation});
setListAdapter(adapter);
}
registerForContextMenu(getListView());
}
我已经尝试放置Cursor.requery()
,并且已经尝试将ListAdapter更改为BaseAdapter所以我可以使用notifydatasetchanged()
但是什么也没发生。。我的列表视图仍然没有更新
请帮我解决这个问题
您需要做的是将代码放入监听器中,以便在单击按钮后激活事件,而不是在onCreate
中激活一次。此外,通过重新实例化游标并在适配器上调用changeCursor
,还可以更改由游标支持的列表视图。我希望下面的代码能让事情变得更清楚:
private RadioButton rbname, rblocation;
private SimpleCursorAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
db = new DatabaseHelper(this);
rbname = (RadioButton)findViewById(R.id.radio0);
rblocation = (RadioButton)findViewById(R.id.radio1);
Cursor cursor = db
.getReadableDatabase()
.rawQuery("SELECT * FROM " + DatabaseHelper.LIST + " ORDER BY " + DatabaseHelper.NAME, null);
// a default cursor
adapter = new SimpleCursorAdapter(this, R.layout.row, Cursor,
new String[] {DatabaseHelper.NAME, DatabaseHelper.ADDRESS, DatabaseHelper.GENDER, DatabaseHelper.LOCATION},
new int[] {R.id.txtName, R.id.txtAddress, R.id.txtGender, R.id.txtLocation});
setListAdapter(adapter); // do the adapter stuff here to avoid repeating code
initListeners(); // set up the listeners for the radio buttons
registerForContextMenu(getListView());
}
private void initListeners() {
rbname.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
Cursor cursor = db
.getReadableDatabase()
.rawQuery("SELECT * FROM " + DatabaseHelper.LIST + " ORDER BY " + DatabaseHelper.NAME, null);
adapter.changeCursor(cursor); // change cursor in adapter so that listview changes
}
}
});
rblocation.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
Cursor cursor = db
.getReadableDatabase()
.rawQuery("SELECT * FROM " + DatabaseHelper.LIST+ " ORDER BY " + DatabaseHelper.LOCATION, null);
adapter.changeCursor(cursor);
}
}
});
}
我很久以前也遇到过同样的问题,帮助我生成了一个刷新方法。所以每次我需要刷新时,我都简单地调用这个方法。
private void refresh() {
ListView yourListView = getListView();
list = getList(); //this is a List<string>
adapter = new ArrayAdapter<String> (this,R.layout.your_listview_item,list); //this is ArrayAdapter<String>
yourListView.setAdapter(adapter);
yourListView.invalidateViews();
}
这在我的ListActivity 中运行良好