Arraylist не работает, элементы не складываются - PullRequest
0 голосов
/ 05 февраля 2020

Итак, я пытаюсь получить некоторую информацию из database и сохранить ее в ArrayList, чтобы позже я мог динамически добавлять buttons в соответствии с length и items из этого списка.

код:

private List<String> probleme = new ArrayList<>();

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

    if (SharedPrefManager.getInstance(this).isLoggedIn()) {
        CautaProbleme();
        for(int i=0; i<probleme.size(); i++) {
            Button myButton = new Button(this);
            myButton.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
            myButton.setText(probleme.get(i));
            LinearLayout layout = (LinearLayout) findViewById(R.id.linear_home);
            layout.addView(myButton);
        }
    }`

Метод CautaProbleme:

private void CautaProbleme(){
    class CautaProbleme extends AsyncTask<Void, Void, String> {
        User user = SharedPrefManager.getInstance(getApplicationContext()).getUser();
        final String departament = String.valueOf(user.getDepartament());
        @Override
        protected String doInBackground(Void... voids) {
            //creating request handler object
            RequestHandler requestHandler = new RequestHandler();

            //creating request parameters
            HashMap<String, String> params = new HashMap<>();
            params.put("departament", departament);

            //returing the response
            return requestHandler.sendPostRequest(URLs.URL_PROBLEME, params);
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //displaying the progress bar while user registers on the server
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            //hiding the progressbar after completion

            try {
                //converting response to json object
                JSONObject obj = new JSONObject(s);

                //if no error in response
                if (!obj.getBoolean("error")) {
                    JSONArray problemeArray = obj.getJSONArray("probleme");
                    for (int i = 0; i < problemeArray.length(); i++) {
                        JSONObject problema = problemeArray.getJSONObject(i);
                        // Verificare daca s-au primit probleme trimise de server
                        if (!problema.isNull("Problema")) {
                            String situatie = problema.getString("Problema");
                            probleme.add(situatie);
                        }
                    }

                } else {
                    Toast.makeText(getApplicationContext(), "Some error occurred", Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
    CautaProbleme ru =new CautaProbleme();
    ru.execute();
}

Ответ JSON в порядке, problemeArray выглядит хорошо, но проблема в том, что Команда .add() не добавляет strings в список, поэтому for для создания buttons ничего не делает, имея пустой list. Я объявил private List probleme = new ArrayList<>(); во всем мире.

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

AsyncTask выполняется асинхронно, поэтому вам нужно дождаться окончания sh выполнения, чтобы получить данные. Лучше использовать обратный вызов для вызова после завершения операции.

Шаг - 1: Удалить код создания кнопки из onCreate и добавить его в обратный вызов

@Override
protected void onCreate(Bundle savedInstanceState) {

    ....

    if (SharedPrefManager.getInstance(this).isLoggedIn()) {
        CautaProbleme();
    }
}

Добавить функцию обратного вызова и обновить логи c здесь

private void createButtonDynamically() {
    LinearLayout layout = (LinearLayout) findViewById(R.id.linear_home);

    for (int i = 0; i < probleme.size(); i++) {
        Button myButton = new Button(this);
        myButton.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        myButton.setText(probleme.get(i));
        layout.addView(myButton);
    }
}

Шаг - 2: Вызвать обратный вызов из onPostExecute, когда операция завершена sh

class CautaProbleme extends AsyncTask<Void, Void, String> {

    ....

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        ....

        createButtonDynamically();
    }
}
0 голосов
/ 05 февраля 2020

Проблема CautaProme запускается в фоновом режиме, пока вы переходите к for l oop. Вы должны отправить интерфейс с методом onReady() на ASyncTask и вызвать его с onPostExecute.

Затем, где вы реализуете (Activity) onReady(), вы можете сделать

 for(int i=0; i<probleme.size(); i++) {
        Button myButton = new Button(this);
        myButton.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        myButton.setText(probleme.get(i));
        LinearLayout layout = (LinearLayout) findViewById(R.id.linear_home);
        layout.addView(myButton);
    }
...