toxa_1995
@toxa_1995
Начинающий...

Как отсортировать данные в ListView?

Есть следующий код, который получает json и парсит его, затем данные передаются в ListView через SimpleAdapter. В лист передается три массива: имя, номер и навыки. Нужно отсортиовать по имени. Как это можно сделать?
private class GetJson extends AsyncTask<Void, Void, Void>{

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            Log.d(LOG_TAG, "Json data is downloading...");

            Toast.makeText(getApplicationContext(),
                    "Json data is downloading...", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            HttpHandler httpHandler = new HttpHandler();

            String jsonString = httpHandler.makeServiceCall(URL_MOCKY);

            Log.d(LOG_TAG, "Response from url: " + jsonString);

            if (jsonString != null){

                try{
                    JSONObject jsonObject = new JSONObject(jsonString);

                    //json объект company
                    final JSONObject jsonObjectCompany = new JSONObject(jsonObject.getString(COMPANY));

                    //массив competences из объекта company
                    JSONArray jsonArrayCompetences = jsonObjectCompany.getJSONArray(COMPANY_COMPETENCES);

                    final StringBuilder stringBuilder = new StringBuilder();

                    //создание строки из массива competences
                    for (int i = 0; i < jsonArrayCompetences.length(); i++) {

                        stringBuilder.append(jsonArrayCompetences.get(i).toString());

                        if (i != jsonArrayCompetences.length() - 1){
                            stringBuilder.append(", ");
                        } else
                            stringBuilder.append(";");
                    }

                    //вывод данных в TextView (name, age and competences)
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            try {

                                String name = "Name: " + jsonObjectCompany.getString(COMPANY_NAME);
                                String age = "Age: " + jsonObjectCompany.getString(COMPANY_AGE);
                                String competences = "Competences: " + stringBuilder.toString();

                                textViewCompName.setText(name);
                                textViewCompAge.setText(age);
                                textViewCompCompetences.setText(competences);

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    });

                    //массив employees из объекта company
                    JSONArray jsonArrayEmployees = jsonObjectCompany.getJSONArray(COMPANY_EMPLOYEES);

                    /*
                    Создание объектов из элементов массива employees и
                    получение его данных: имени, номера телефона и навыков.
                    Навыки представляют массив, поэтому переводятся в строку
                     */
                    for (int i = 0; i < jsonArrayEmployees.length(); i++) {
                        JSONObject jsonObjectEmployees = jsonArrayEmployees.getJSONObject(i);

                        JSONArray jsonArraySkills = jsonObjectEmployees.getJSONArray(EMPLOYEES_SKILLS);

                        StringBuilder stringBuilderSkills = new StringBuilder();

                        for (int j = 0; j < jsonArraySkills.length(); j++) {

                            stringBuilderSkills.append(jsonArraySkills.get(j));

                            if (j != jsonArraySkills.length() - 1){
                                stringBuilderSkills.append(", ");
                            }
                        }

                        String name = jsonObjectEmployees.getString(EMPLOYEES_NAME);
                        String phone = jsonObjectEmployees.getString(EMPLOYEES_PHONE);
                        String skills = stringBuilderSkills.toString();

                        //добавление данных в Map
                        Map<String, String> map = new HashMap<>();
                        map.put(ATTRIB_NAME, name);
                        map.put(ATTRIB_PHONE, phone);
                        map.put(ATTRIB_SKILLS, skills);

                        //добавление Map в лист
                        arrayList.add(map);
                    }

                    //создание from и to массивов для SimpleAdapter
                    from = new String[] {ATTRIB_NAME, ATTRIB_PHONE, ATTRIB_SKILLS};
                    to = new int[] {R.id.textViewName, R.id.textViewPhone, R.id.textViewSkills};

                } catch (final Exception e){
                    Log.e(LOG_TAG, "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(LOG_TAG, "Couldn't get json from server");

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "Couldn't get json from server",
                                Toast.LENGTH_LONG).show();
                    }
                });
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            ListAdapter listAdapter = new SimpleAdapter(getApplicationContext(),
                    arrayList,
                    R.layout.listview_item,
                    from,
                    to);
            listViewData.setAdapter(listAdapter);

            Toast.makeText(getApplicationContext(), "Upload finished", Toast.LENGTH_SHORT).show();
        }
    }
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ответы на вопрос 3
thelongrunsmoke
@thelongrunsmoke
Программист
Данные сначала сортируются, а потом отображаются.
Ответ написан
Комментировать
@YuryBorodkin
Android dev
Да, сортируется перед отдачей в адаптер, а если надо динамически менять положение ячеек - внутри адаптера, меняем положение предметов в источнике данных ддя ячеек и делаем notifyDataSetChanged();
Ответ написан
Комментировать
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы