Обновление переменной 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());
}
}