Android:notifyDataSetChanged(); 不工作

Kat*_*e99 19 android refresh adapter

我在服务器和数据库中有一个数据库,我从数据库中的一个表中获取一些值.我将这些信息正确地加载到列表中,但我想知道为什么当有变化时,即使我使用也没有任何反应notifyDataSetChanged();.我必须说,为了加载加载数据y使用AsyncTaskClass所以,我的问题是我不知道是否使用notifyDataSetChanged(); 方法正确,因为如果有变化我想刷新图像.以下是该类代码的一部分:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.all_candidatos);


        candidatosList = new ArrayList<HashMap<String, String>>();

        new CargarCandidatos().execute();
    }


//  public void timer(){
//       new CountDownTimer(tiempo, 100) {
//
//              public void onTick(long millisUntilFinished) {
//                  
//              }
//
//              public void onFinish() {
//              //  new CargarCandidatos().execute();
//
//              }
//           }.start();}



    /**
     * Background Async Task to Load all product by making HTTP Request
     * */
    class CargarCandidatos extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(Monitorizacion.this);
            pDialog.setMessage("Loading ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        /**
         * getting All products from url
         * */
        protected String doInBackground(String... args) {
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            JSONObject json = jParser.makeHttpRequest(url_candidatos, "GET", params);

            Log.d("Candidatos: ", json.toString());

            try {
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {

                    candidatos = json.getJSONArray(TAG_CANDIDATOS);

                    for (int i = 0; i < candidatos.length(); i++) {
                        JSONObject c = candidatos.getJSONObject(i);

                        // Storing each json item in variable
                        String nserie = c.getString(TAG_NSERIE);
                        String dni = c.getString(TAG_DNI);
                        String nombre = c.getString(TAG_NOMBRE);
                        String test = c.getString(TAG_TEST);
                        String pregunta = c.getString(TAG_PREGUNTA);
                        String bateria = c.getString(TAG_BATERIA);

                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();

                        // adding each child node to HashMap key => value
                        map.put(TAG_NSERIE, nserie);
                        map.put(TAG_DNI, dni);
                        map.put(TAG_NOMBRE, nombre);
                        map.put(TAG_TEST, test);
                        map.put(TAG_PREGUNTA, pregunta);
                        map.put(TAG_BATERIA, bateria);

                        // adding HashList to ArrayList
                        candidatosList.add(map);
                    }
                } 
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            pDialog.dismiss();
            runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     * */
                    adapter = new SimpleAdapter(
                            Monitorizacion.this, candidatosList,
                            R.layout.list_item, new String[] { TAG_NSERIE,
                                    TAG_DNI, TAG_NOMBRE, TAG_TEST, TAG_PREGUNTA, TAG_BATERIA},
                            new int[] { R.id.id, R.id.dni, R.id.nombre, R.id.test, R.id.pregunta, R.id.bateria});
                    setListAdapter(adapter);
                    adapter.notifyDataSetChanged();
                //  timer();
                }
            });

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Saz*_*han 96

其中一个主要原因notifyDataSetChanged()对你不起作用 - 是的,

您的适配器丢失对您的列表的引用.

当你第一次初始化时,Adapter它需要你的引用arrayList并将它传递给它的超类.但是,如果你重新初始化你的现有arrayList它会丢失参考,因此,通信渠道会丢失Adapter.

在创建和添加新列表时Adapter.始终遵循以下准则:

  1. 初始化arrayListwhile同时在全局声明它.
  2. 直接将List添加到适配器,不检查null和空值.直接将适配器设置为列表(不检查任何条件).适配器保证您无论何时对其数据进行更改arrayList都会照顾它,但绝不会丢失引用.
  3. 随时修改ArrayList中本身的数据(如果你的数据完全是新的比你可以打电话adapter.clear()arrayList.clear()之前实际上将数据添加到列表中),但不设置适配器,即如果新的数据是在人口arrayList不仅仅是 adapter.notifyDataSetChanged()

坚持文档.

  • 非常感谢你,我的问题是不相信适配器的力量. (2认同)
  • 非常感谢,通过您的解释,我了解了很多关于适配器和列表视图的内容,也为我的许多疑问找到了解决方案。 (2认同)

use*_*629 5

您需要编辑的内容是

runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     * */
                    adapter = new SimpleAdapter(
                            Monitorizacion.this, candidatosList,
                            R.layout.list_item, new String[] { TAG_NSERIE,
                                    TAG_DNI, TAG_NOMBRE, TAG_TEST, TAG_PREGUNTA, TAG_BATERIA},
                            new int[] { R.id.id, R.id.dni, R.id.nombre, R.id.test, R.id.pregunta, R.id.bateria});
                    setListAdapter(adapter);
                    adapter.notifyDataSetChanged();
                //  timer();
                }
            });
Run Code Online (Sandbox Code Playgroud)

到OnCreate()中。并从Asynctask返回列表candidatosList。比设置定时器来更新candidatosList列表。


hea*_*des 5

如果您有一个空的覆盖,可能值得检查registerDataSetObserver()。Android Studio 为我添加了一个,而没有实现对 super 的调用。如下添加它足以让我的 listView 再次工作:

@Override
    public void registerDataSetObserver(DataSetObserver observer) {
        super.registerDataSetObserver(observer);    
    }
Run Code Online (Sandbox Code Playgroud)