ListView 未在 AsyncTask 中使用适配器进行更新

Posted

技术标签:

【中文标题】ListView 未在 AsyncTask 中使用适配器进行更新【英文标题】:ListView not getting updated with adapter in AsyncTask 【发布时间】:2021-04-08 19:22:18 【问题描述】:

我是 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);

我的应用使用搜索视图从数据库中获取数据,然后将其显示在列表视图中。

【问题讨论】:

【参考方案1】:

最好先创建视图和适配器,然后再获取数据更新适配器并调用适配器。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();
   

【讨论】:

但是 onPostExecute() 也在主线程中被调用,所以它也应该更新视图。

以上是关于ListView 未在 AsyncTask 中使用适配器进行更新的主要内容,如果未能解决你的问题,请参考以下文章

使用 AsyncTask 在 ListView 中加载图片

使用 asynctask 在所有 Fragment 中的 Activity 中显示 ListView

JSONArray 到 ListView - AsyncTask

AsyncTask 在 doInBackground 中崩溃,添加到 listview

从 AsyncTask 填充 ListView 的 Android 小部件

AsyncTask 完成后 ListView 上的 setOnItemClickListener