java - ListView 未使用 AsyncTask 中的适配器更新
问题描述
我是 Android 和 SQLite 的初学者,在我的应用程序中,我从 SQLite 数据库获取数据并使用 AsyncTask 将其添加到 ListView。但是 ListView 在 onPostExecute 方法中没有得到更新。
主要活动代码 -
private class Updateentries extends AsyncTask<String, Void, Void>{
@Override
protected Void doInBackground(String... strings) {
cursor = db.query(SQLiteHelper.Table_name, new String[]{"name"}, "name like ?", new String[]{"%"+strings[0]+"%"}, null, null, null );
cursorarray = new ArrayList<>();
if(!cursor.moveToFirst()){
Toast.makeText(OtherActivity.this, "NO DATA FOUND", Toast.LENGTH_SHORT).show();
}else{
do {
String entry = cursor.getString(cursor.getColumnIndex(SQLiteHelper.name_column));
cursorarray.add(entry);
}while(cursor.moveToNext());
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
displaylistadapt = new ArrayAdapter(getApplicationContext(), android.R.layout.simple_list_item_1,cursorarray);
displaylist.setAdapter(displaylistadapt);
super.onPostExecute(aVoid);
}
}
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.searchactionbar, menu);
searchtoggle = (SearchView) menu.findItem(R.id.search_toggle).getActionView();
searchtoggle.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
new Updateentries().execute(query);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
我的应用程序使用搜索视图从数据库中获取数据,然后将其显示在列表视图中。
解决方案
最好先创建视图和适配器,然后再获取数据更新适配器并调用适配器。notifyDataSetChanged()
也代替getApplicationContext()
使用activityContext
ArrayList<String> cursorarray = new ArrayList();
class MainActivity{
void oncreate(){
...
displaylistadapt = new ArrayAdapter(this, android.R.layout.simple_list_item_1,cursorarray);
displaylist.setAdapter(displaylistadapt);
....
private class Updateentries extends AsyncTask<String, Void, ArrayList<String>>{
@Override
protected ArrayList<String> doInBackground(String... strings) {
cursor = db.query(SQLiteHelper.Table_name, new String[]{"name"}, "name like ?", new String[]{"%"+strings[0]+"%"}, null, null, null );
ArrayList <String> list = new ArrayList<>();
if(!cursor.moveToFirst()){
Toast.makeText(OtherActivity.this, "NO DATA FOUND", Toast.LENGTH_SHORT).show();
}else{
do {
String entry = cursor.getString(cursor.getColumnIndex(SQLiteHelper.name_column));
list.add(entry);
}while(cursor.moveToNext());
}
return list;
}
@Override
protected void onPostExecute(ArrayList<String> list) {
cursorarray.clear();
cursorarray.addAll(list);
displaylistadapt.notifyDataSetChanged();
}
}
推荐阅读
- java - Java 二进制文字:“Long number too large”。
- r - 在 Shiny 中手动展开 menuSubItem
- json - 无法使用 Json.Net 反序列化 JSON 数组
- typescript - Vue $refs 对象的类型为“未知”
- azure-active-directory - Azure Active Directory - UI > API - 401 Error
- scala - Type constraint on input function parameter in Scala
- python - how to prevent data from being repeated in the template even though the context is being nested
- firebase - 使用 Firebase 托管删除 Etag 和 Last-Modified 标头
- python - 如何让这个导航栏品牌以导航栏为中心?
- pandas - 附加不同长度的新 DataFrame 列