简体   繁体   English

ListView 未使用 AsyncTask 中的适配器更新

[英]ListView not getting updated with adapter in AsyncTask

I am a beginner in Android and SQLite and in my app, I'm getting data from the SQLite database and adding it to ListView using AsyncTask.我是 Android 和 SQLite 的初学者,在我的应用程序中,我从 SQLite 数据库中获取数据并使用 AsyncTask 将其添加到 ListView。 But the ListView is not getting updated in the onPostExecute method.但是 ListView 在 onPostExecute 方法中没有得到更新。

The main activity code -主要活动代码 -

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);
}

My app uses a search view to fetch data from the database and then show it in listview.我的应用程序使用搜索视图从数据库中获取数据,然后将其显示在列表视图中。

it's better to create views and adapter in the first then when you fetch your data update adapter and call adapter.最好先创建视图和适配器,然后再获取数据更新适配器并调用适配器。 notifyDataSetChanged()

also instead of getApplicationContext() use activityContext也代替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();
   }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM