Обновление переменной MainActivity после OKHttp

Я использую OKHttp для извлечения данных с сервера и ищу, чтобы обновить переменную объекта List в MainActivity после нажатия кнопки. Код требует два нажатия кнопки во время первоначального запуска приложения (вместо одного нажатия), чтобы обновить список. Как получить обновленный список после одного клика (как это должно работать). Обратите внимание, что я пробовал разные сценарии, например, создание статического объекта List и обновление в потоке и после его завершения. Мой сокращенный код ниже.

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getName();
    Button button;
    public TextView jsonTextView;
    String url =   "http://www.mocky.io/v2/5aa0d0c8320000941ce9fd7c";
    private static List<ClientsInfo> infoData; //static variable to be 
                                           //updated after threading 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       button = findViewById(R.id.button);
       infoData = new ArrayList();
       button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getJsonDataAndProcess();
            }
        });
    }

    private void getJsonDataAndProcess() {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, final Response response) 
                        throws IOException {
                if (response.isSuccessful()) {
                    final String myResponse = response.body().string();
                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                             formatJsonData(myResponse);
                        }
                    });
                }
            }
        });
    }

    public void formatJsonData(String response){
        try{
            //Json object of the parsed data
            JSONArray JA = new JSONArray(response);
            if( infoData != null)
                infoData.clear();

            for (int i = 0; i < JA.length(); i++){

                JSONObject JO = (JSONObject) JA.get(i);
                ClientsInfo info = new ClientsInfo();//object stored in list
                info.setId_Number( Integer.toString((Integer) JO.get("id")));
                info.setFirst_Name((String) JO.get("first_name"));
                info.setLast_Name((String) JO.get("last_name"));
                info.setEmail((String) JO.get("email"));
                info.setGender((String) JO.get("gender"));
                info.setIp_Address((String) JO.get("ip_address"));
                infoData.add(info);
            }
        } catch(Exception e){
            Log.i("ERROR2", e.toString());
        }
    }
}
//end of mainActivity

1 ответ

Вам просто нужно добавить notifyDataSetChanged в вашем formatJsonData Функция, как только вы заполнили список информации.

public void formatJsonData(String response){
    try{
        //Json object of the parsed data
        JSONArray JA = new JSONArray(response);
        if(infoData != null)
            infoData.clear();

        for (int i = 0; i < JA.length(); i++){
            JSONObject JO = (JSONObject) JA.get(i);
            ClientsInfo info = new ClientsInfo();//object stored in list
            info.setId_Number( Integer.toString((Integer) JO.get("id")));
            info.setFirst_Name((String) JO.get("first_name"));
            info.setLast_Name((String) JO.get("last_name"));
            info.setEmail((String) JO.get("email"));
            info.setGender((String) JO.get("gender"));
            info.setIp_Address((String) JO.get("ip_address"));
            infoData.add(info);
        }

        // Just call the notifyDataSetChanged here on your adapter.
        yourAdapter.notifyDataSetChanged();

    } catch(Exception e){
        Log.i("ERROR2", e.toString());
    }
}
Другие вопросы по тегам