如何刷新Android listview evry 10秒

时间:2017-07-05 11:10:09

标签: android listview refresh

我在Android上非常新。我正在制作这个teturial,但我在刷新时遇到问题,无法理解如何刷新我的列表视图

        // Creating volley request obj
    JsonArrayRequest movieReq = new JsonArrayRequest(url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d(TAG, response.toString());
                    hidePDialog();

                    // Parsing json
                    for (int i = 0; i < response.length(); i++) {
                        try {

                            JSONObject obj = response.getJSONObject(i);
                            Movie movie = new Movie();
                            movie.setTitle(obj.getString("title"));
                            movie.setThumbnailUrl(obj.getString("image"));
                            movie.setRating(((Number) obj.get("rating"))
                                    .doubleValue());
                            movie.setYear(obj.getInt("releaseYear"));

                            // Genre is json array
                            JSONArray genreArry = obj.getJSONArray("genre");
                            ArrayList<String> genre = new ArrayList<String>();
                            for (int j = 0; j < genreArry.length(); j++) {
                                genre.add((String) genreArry.get(j));
                            }
                            movie.setGenre(genre);

                            // adding movie to movies array
                            movieList.add(movie);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }

                    // notifying list adapter about data changes
                    // so that it renders the list view with updated data
                    adapter.notifyDataSetChanged();
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                    hidePDialog();

                }
            });


/** REFRESH HERE /** 

 Thread t = new Thread() {

        @Override
        public void run() {
            try {
                while (!isInterrupted()) {
                    Thread.sleep(10000);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.e(TAG, "EVRY 10 SECOND START NOW ");

                            listView.invalidateViews();
                            listView.refreshDrawableState();
                            adapter.notifyDataSetChanged();

//                                Log.e(TAG, String.valueOf(movieList));

                            // fire the event

                        }
                    });
                }
            } catch (InterruptedException e) {
            }
        }
    };

    t.start();
    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(movieReq);

我尝试所有方法google ...但没有运气这个notifyDataSetChanged()没有工作......

 listView.invalidateViews();
listView.refreshDrawableState();
adapter.notifyDataSetChanged();

3 个答案:

答案 0 :(得分:2)

使用Handler及其postDelayed方法使列表的适配器无效,如下所示:

    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            adapter.notifyDataSetChanged();
            handler.postDelayed(this, 10 * 1000);
        }
    }, 10 * 1000);

您必须只更新主(UI)线程中的UI。

通过在主线程中创建处理程序,您可以确保发布到处理程序的所有内容也在主线程中运行。

答案 1 :(得分:2)

将您的Volley请求代码放在方法中,我们将其命名为id fetchData();

然后您可以在10秒后通过以下代码再次拨打您的服务:

final Handler mHandler = new Handler();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(10000);
                        mHandler.post(new Runnable() {

                            @Override
                            public void run() {
                                // Write your code here to call the method.
                              fetchData();
                            }
                        });
                    } catch (Exception e) {
                        // TODO: handle exception here
                        e.printStackTrace();
                    }
                }
            }
        }).start();

试试这个,如果有任何问题,请告诉我。

答案 2 :(得分:0)

使用计时器:

 Timer timerAsync;
 TimerTask timerTaskAsync;

timerAsync = new Timer();
        timerTaskAsync = new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        doWork();
                    }
                });
            }
        };
        timerAsync.schedule(timerTaskAsync, 1000, 5000);// First Start 1 seconds 5 seconds repeat