当使用 SwipeRefreshLayout 刷新 listView 时,我又得到了一个带有数据的 ListView

When refreshing listView with SwipeRefreshLayout i'm getting one more ListView with data

我已经在我的 Activity 中成功实现了 SwipeRefreshLayout,但是我可能已经在某处部署了适配器和这个 SwipeRefreshLayout.

或者我是否需要这些 ProgressDialog

也许这就是问题所在,我是新手,所以非常感谢您的帮助。

如果有人可以帮助我找到问题,请参考以下代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lista_preporuka);

        // Toolbabr settings
        getSupportActionBar().setDisplayShowHomeEnabled(true);   
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayUseLogoEnabled(true);
        getSupportActionBar().setLogo(R.drawable.ic_horor_filmovi_ikonica);

        Intent newActivity2=new Intent();
        setResult(RESULT_OK, newActivity2);

        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
          @Override
          public void run() {
              noInternet();
          }
        }, 100);

        listView = (ListView) findViewById(R.id.list);
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
        adapter = new CustomListAdapter(this, movieList);
        listView.setAdapter(adapter);

        pDialog = new ProgressDialog(this);
        // Showing progress dialog before making http request
        pDialog.setMessage("Učitavanje...");
        pDialog.setCancelable(false);
        pDialog.show();      

        swipeRefreshLayout.setOnRefreshListener(this);

        /**
         * Showing Swipe Refresh animation on activity create
         * As animation won't start on onCreate, post runnable is used
         */
        swipeRefreshLayout.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        swipeRefreshLayout.setRefreshing(true);

                                        fetchMovies();
                                    }
                                }
        );


        listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) { 
                String name = ((TextView) view.findViewById(R.id.title))
                        .getText().toString();

                String opisFilma = ((TextView) view.findViewById(R.id.opis))
                        .getText().toString();

                String urlFilm = ((TextView) view.findViewById(R.id.url))
                        .getText().toString();

                String ocena = String.valueOf(movieList.get(position).getRating());

                String godina = String.valueOf(movieList.get(position).getYear());

                bitmap = ((Movie)movieList.get(position)).getThumbnailUrl();

                Intent intent = new Intent(ListaPreporuka.this, MoviesSingleActivity.class);    
                intent.putExtra(Title, name);
                intent.putExtra(opis, opisFilma);
                intent.putExtra("images", bitmap);
                intent.putExtra(Rating, ocena);
                intent.putExtra(Year, godina);
                intent.putExtra(urlMovie, urlFilm);
                startActivity(intent);
                overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
                }
            });

    }

    @Override
    public void onRefresh() {
        fetchMovies();

    }

    private void fetchMovies(){

        // showing refresh animation before making http call
        swipeRefreshLayout.setRefreshing(true);

        // 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.setOpis(obj.getString("opis"));
                                movie.setThumbnailUrl(obj.getString("image"));
                                movie.setRating(((Number) obj.get("rating"))
                                        .doubleValue());
                                movie.setYear(obj.getInt("releaseYear"));
                                movie.setUrl(obj.getString("url"));

                                // Genre is json array
                                final 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();
                            }                        

                        }
                                adapter.notifyDataSetChanged();  

                             // stopping swipe refresh
                                swipeRefreshLayout.setRefreshing(false);
                    }


                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        hidePDialog();

                        // stopping swipe refresh
                        swipeRefreshLayout.setRefreshing(false);
                    }
                });

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

    @Override
    public void onDestroy() {
        super.onDestroy();
        hidePDialog();
    }

    private void hidePDialog() {
        if (pDialog != null) {
            pDialog.dismiss();
            pDialog = null;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        if (item.getItemId() == android.R.id.home) {
            finish();
            overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
            return true;
        }
        return false;
    }

    @Override
    public void onBackPressed() {

        super.onBackPressed();
        overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
    }

    private void noInternet() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        if (info != null) {
            if (!info.isConnected()) {
            }
        }
        else {
            Toast.makeText(this, "No Internet Connection", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(ListaPreporuka.this, NoConnection.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
            overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
        }
    }

}

首先,您真的根本不需要使用ProgressDialog,但这不是问题所在。

在将新数据附加到它之前,您只需清除 movieList

类似于:

movieList.clear();

在添加新数据之前,List会删除所有元素。

您的 onResponse() 方法中是个好地方。在 for 循环之前。

P.S.: 您正在调用 swipeRefreshLayout.setRefreshing(true); 两次。

更多关于 ArrayList here