Swipte to Refresh不断添加TextView

时间:2018-04-27 13:23:33

标签: android listview

我正在使用Android应用程序,该应用程序使用API​​中的信息并将其显示在列表视图中。它有效,但我无法弄清楚如何正确实现Swipe to Refresh。现在它刷新时不会更新列表TextView字段中的数据,但会在下面添加更多数据。我对此非常陌生,并希望能帮助您解决这个问题。

这是我到目前为止的代码。

MainActivity.java

    public class MainActivity extends AppCompatActivity {

    private String TAG = MainActivity.class.getSimpleName();

    private ProgressDialog pDialog;
    private ListView lv;

    ArrayList<HashMap<String, String>> coinList;
    ArrayList<HashMap<String, String>> priceList;

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


        //Swipe Refresh tests

        final SwipeRefreshLayout swipeView = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);

        swipeView.setEnabled(false);

        ListView lView = (ListView) findViewById(R.id.list);
        ArrayAdapter<String> adp = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, R.id.list);
        lView.setAdapter(adp);


        swipeView.setOnRefreshListener(
                new SwipeRefreshLayout.OnRefreshListener() {
                    @Override
                    public void onRefresh() {
                        swipeView.setRefreshing(true);
                        ( new Handler()).postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                swipeView.setRefreshing(false);
                            }
                        }, 1000);

                        new GetStats().execute();
                    }
                });

        lView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int i) {
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if (firstVisibleItem == 0)
                    swipeView.setEnabled(true);
                else
                    swipeView.setEnabled(false);

            }
        });

        ///// END OF SWIPE REFRESH TEST CODE ////



        coinList = new ArrayList<>();
        priceList = new ArrayList<>();

        lv = (ListView) findViewById(R.id.list);                    // Needs to be here seemingly!!

        new GetStats().execute();
    }


    // Async task class to get JSON over HTTP call

    private class GetStats extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute () {
            super.onPreExecute();
            // Progress Dialog
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Please Wait...");
            pDialog.show();
        }


        @Override
        protected  Void doInBackground(Void... arg0) {
            HttpHandler sh = new HttpHandler();

            // URL request and response
            String url = "URL";
            String url2 = "URL";
            String jsonStr = sh.makeServiceCall(url);
            String jsonStr2 = sh.makeServiceCall(url2);

            Log.e(TAG, "Response from url: " + jsonStr);
            Log.e(TAG, "Response from url2: " + jsonStr2);

            if (jsonStr != null) {
                try {                                                                                   /// BEGINNING of Parsing Try
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    // Get JSON Object "getuserallbalances"
                    JSONObject userBalances = jsonObj.getJSONObject("getuserallbalances");

                    // Get JSON Array "data"
                    JSONArray data = userBalances.getJSONArray("data");

                    // Loop through all data
                    for (int i = 0; i < data.length(); i++) {
                        JSONObject d = data.getJSONObject(i);

                        String coin = d.getString("coin");
                        String confirmed = d.getString("confirmed");
                        String unconfirmed = d.getString("unconfirmed");
                        String aeConfirmed = d.getString("ae_confirmed");
                        String aeUnconfirmed = d.getString("ae_unconfirmed");
                        String exchange = d.getString("exchange");

                        //Convert to BigDecimal
                        BigDecimal dConfirmed = new BigDecimal(confirmed);
                        BigDecimal dUnconfirmed = new BigDecimal(unconfirmed);
                        BigDecimal dAeConfirmed = new BigDecimal(aeConfirmed);
                        BigDecimal dAeUnconfirmed = new BigDecimal(aeUnconfirmed);
                        BigDecimal dExchange = new BigDecimal(exchange);

                        // Temp HashMap for single coin
                        HashMap<String, String> coins = new HashMap<>();

                        // Add each child node to HashMap key => value
                        coins.put("coin", coin.toUpperCase());
                        coins.put("confirmed", "Confirmed: " + dConfirmed);
                        coins.put("exchange", "Exchange: " + dExchange);
                        coins.put("unconfirmed", "Unconfirmed: " + dUnconfirmed);
                        coins.put("ae_confirmed", "AE Confirmed: " + dAeConfirmed);
                        coins.put("ae_unconfirmed", "AE Unconfirmed: " + dAeUnconfirmed);

                        // Add to list
                        coinList.add(coins);
                    }
                } catch (final JSONException e) {                                                       /// END of Parsing TRY
                    Log.e(TAG, "JSON parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "JSON parsing error: " + e.getMessage(),
                                    Toast.LENGTH_LONG).show();
                        }
                    });
                }
            } else {
                Log.e(TAG, "Couldn't get JSON from server.");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "Couldn't get JSON from server. Check LogCat!",
                                Toast.LENGTH_LONG).show();
                    }
                });
            }


            // Second API call (CoinMarketCap)
            if (jsonStr2 != null) {
                try {                                                                                   /// BEGINNING of Parsing Try
                    // Get JSON Array
                    JSONArray jsonArr = new JSONArray(jsonStr2);



                    // Loop through all data
                    for (int i = 0; i < jsonArr.length(); i++) {
                        JSONObject p = jsonArr.getJSONObject(i);

                        String id = p.getString("id");
                        String price_usd = p.getString("price_usd");

                        // Temp HashMap for single coin
                        HashMap<String, String> prices = new HashMap<>();

                        // Add each child node to HashMap key => value
                        prices.put("id", id.toUpperCase());
                        prices.put("perice_usd", price_usd);


                        // Add to list
                        priceList.add(prices);
                    }
                } catch (final JSONException e) {                                                       /// END of Parsing TRY
                    Log.e(TAG, "JSON parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "JSON parsing error: " + e.getMessage(),
                                    Toast.LENGTH_LONG).show();
                        }
                    });
                }
            } else {
                Log.e(TAG, "Couldn't get JSON from server.");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "Couldn't get JSON from server. Check LogCat!",
                                Toast.LENGTH_LONG).show();
                    }
                });
            }



            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();

            // Update parsed JSON into ListView
            ListAdapter adapter = new SimpleAdapter(
                    MainActivity.this, coinList,
                    R.layout.list_item, new String[]{"coin", "confirmed",
                    "exchange", "unconfirmed", "ae_confirmed", "ae_unconfirmed"}, new int[]{R.id.coin,
                    R.id.confirmed, R.id.exchange, R.id.unconfirmed, R.id.ae_confirmed, R.id.ae_unconfirmed});

            lv.setAdapter(adapter);
        }

    }
}

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipe_refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

    </android.support.v4.widget.SwipeRefreshLayout>



</RelativeLayout>

希望这有一定意义,并且真的会给予任何帮助!如果我可以做到这一点,我可能会有更多的问题,但现在一次只有一件事。 :P

谢谢! :)

1 个答案:

答案 0 :(得分:0)

在调用异步任务时,在刷卡刷新侦听器中,每次都在创建新的适配器。只需在数据上调用notifyDataChanged即可。

在您的后台任务中,首先检查您的priceList中是否已存在数据,然后不要在列表中添加该项目。

或者您可以先清除列表,然后将json中的所有结果添加到价目表中。

以下是在刷卡刷新时清除列表的代码:

public class MainActivity extends AppCompatActivity {

    private String TAG = MainActivity.class.getSimpleName();

    private ProgressDialog pDialog;
    private ListView lv;
    ListAdapter adapter;

    ArrayList<HashMap<String, String>> coinList;
    ArrayList<HashMap<String, String>> priceList;

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


        //Swipe Refresh tests

        final SwipeRefreshLayout swipeView = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);

        swipeView.setEnabled(false);

        ListView lView = (ListView) findViewById(R.id.list);

        adapter = new SimpleAdapter(
                    MainActivity.this, coinList,
                    R.layout.list_item, new String[]{"coin", "confirmed",
                    "exchange", "unconfirmed", "ae_confirmed", "ae_unconfirmed"}, new int[]{R.id.coin,
                    R.id.confirmed, R.id.exchange, R.id.unconfirmed, R.id.ae_confirmed, R.id.ae_unconfirmed});
        lView.setAdapter(adapter);


        swipeView.setOnRefreshListener(
                new SwipeRefreshLayout.OnRefreshListener() {
                    @Override
                    public void onRefresh() {
                        swipeView.setRefreshing(true);
                        ( new Handler()).postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                swipeView.setRefreshing(false);
                            }
                        }, 1000);

                        new GetStats().execute();
                    }
                });

        lView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int i) {
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if (firstVisibleItem == 0)
                    swipeView.setEnabled(true);
                else
                    swipeView.setEnabled(false);

            }
        });

        ///// END OF SWIPE REFRESH TEST CODE ////



        coinList = new ArrayList<>();
        priceList = new ArrayList<>();

        lv = (ListView) findViewById(R.id.list);                    // Needs to be here seemingly!!

        new GetStats().execute();
    }


    // Async task class to get JSON over HTTP call

    private class GetStats extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute () {
            super.onPreExecute();
            // Progress Dialog
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Please Wait...");
            pDialog.show();
        }


        @Override
        protected  Void doInBackground(Void... arg0) {
            HttpHandler sh = new HttpHandler();

            // URL request and response
            String url = "https://miningpoolhub.com/index.php?page=api&action=getuserallbalances&api_key=MyApiKey";
            String url2 = "https://api.coinmarketcap.com/v1/ticker/";
            String jsonStr = sh.makeServiceCall(url);
            String jsonStr2 = sh.makeServiceCall(url2);

            Log.e(TAG, "Response from url: " + jsonStr);
            Log.e(TAG, "Response from url2: " + jsonStr2);

            if (jsonStr != null) {
                try { 
                    coinList.clear();                                                                                  /// BEGINNING of Parsing Try
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    // Get JSON Object "getuserallbalances"
                    JSONObject userBalances = jsonObj.getJSONObject("getuserallbalances");

                    // Get JSON Array "data"
                    JSONArray data = userBalances.getJSONArray("data");

                    // Loop through all data
                    for (int i = 0; i < data.length(); i++) {
                        JSONObject d = data.getJSONObject(i);

                        String coin = d.getString("coin");
                        String confirmed = d.getString("confirmed");
                        String unconfirmed = d.getString("unconfirmed");
                        String aeConfirmed = d.getString("ae_confirmed");
                        String aeUnconfirmed = d.getString("ae_unconfirmed");
                        String exchange = d.getString("exchange");

                        //Convert to BigDecimal
                        BigDecimal dConfirmed = new BigDecimal(confirmed);
                        BigDecimal dUnconfirmed = new BigDecimal(unconfirmed);
                        BigDecimal dAeConfirmed = new BigDecimal(aeConfirmed);
                        BigDecimal dAeUnconfirmed = new BigDecimal(aeUnconfirmed);
                        BigDecimal dExchange = new BigDecimal(exchange);

                        // Temp HashMap for single coin
                        HashMap<String, String> coins = new HashMap<>();

                        // Add each child node to HashMap key => value
                        coins.put("coin", coin.toUpperCase());
                        coins.put("confirmed", "Confirmed: " + dConfirmed);
                        coins.put("exchange", "Exchange: " + dExchange);
                        coins.put("unconfirmed", "Unconfirmed: " + dUnconfirmed);
                        coins.put("ae_confirmed", "AE Confirmed: " + dAeConfirmed);
                        coins.put("ae_unconfirmed", "AE Unconfirmed: " + dAeUnconfirmed);
                        Coin coinObj= new Coin(/*pass the arguments*/);
                        // Add to list
                        coinList.add(coins);
                    }
                } catch (final JSONException e) {                                                       /// END of Parsing TRY
                    Log.e(TAG, "JSON parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "JSON parsing error: " + e.getMessage(),
                                    Toast.LENGTH_LONG).show();
                        }
                    });
                }
            } else {
                Log.e(TAG, "Couldn't get JSON from server.");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "Couldn't get JSON from server. Check LogCat!",
                                Toast.LENGTH_LONG).show();
                    }
                });
            }


            // Second API call (CoinMarketCap)
            if (jsonStr2 != null) {
                try {
                    priceList.clear();                                                                                   /// BEGINNING of Parsing Try
                    // Get JSON Array
                    JSONArray jsonArr = new JSONArray(jsonStr2);



                    // Loop through all data
                    for (int i = 0; i < jsonArr.length(); i++) {
                        JSONObject p = jsonArr.getJSONObject(i);

                        String id = p.getString("id");
                        String price_usd = p.getString("price_usd");

                        // Temp HashMap for single coin
                        HashMap<String, String> prices = new HashMap<>();

                        // Add each child node to HashMap key => value
                        prices.put("id", id.toUpperCase());
                        prices.put("perice_usd", price_usd);


                        // Add to list
                        priceList.add(prices);
                    }
                } catch (final JSONException e) {                                                       /// END of Parsing TRY
                    Log.e(TAG, "JSON parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "JSON parsing error: " + e.getMessage(),
                                    Toast.LENGTH_LONG).show();
                        }
                    });
                }
            } else {
                Log.e(TAG, "Couldn't get JSON from server.");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "Couldn't get JSON from server. Check LogCat!",
                                Toast.LENGTH_LONG).show();
                    }
                });
            }



            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();

            // Update parsed JSON into ListView
            // ListAdapter adapter = new SimpleAdapter(
            //         MainActivity.this, coinList,
            //         R.layout.list_item, new String[]{"coin", "confirmed",
            //         "exchange", "unconfirmed", "ae_confirmed", "ae_unconfirmed"}, new int[]{R.id.coin,
            //         R.id.confirmed, R.id.exchange, R.id.unconfirmed, R.id.ae_confirmed, R.id.ae_unconfirmed});

            adapter.notifyDataSetChanged();
        }

    }
}