@pmozil

Как кастомизировать listView в android?

Что бы был такой результат!
089a0c79a5434e27a99205c2995ed4b8.jpg

В AsyncTask выполняется парсинг страницы.Интересуют данные по свободным велосипедам на станциях в городе,то есть название и количество велосипедов,после чего записывается в ArrayList.
Но записать я могу только в один ArrayList,так как вернуть из doInBackground получается только одну переменную.

Записал я поочередно здесь.
while (ilosc.find() && stacja.find()) {
                    output.add(stacja.group(1));
                    
                    output.add(ilosc.group());
                  
                }

то есть в onPostExecute у меня есть одна переменная output,которая содержит нулевым элементом название для первой станции,а первым элементом количество велосипедов для нее.Вторым элементом-название второй станции, третьим количество велосипедов на второй станции..

Я так понимаю,что надо как-то сгруппировать каждые 2 элемента.Или даже 3,чтобы добавить еще расстояние между станциями.
Или как иначе добиться результата,такого как на фото?

class Parse extends AsyncTask<String, Void, List<String>> {

        Document doc;

        protected List<String> doInBackground(String... args) {
            Element mt = null;
            Pattern i = null;
            Pattern n = null;
            Matcher ilosc = null;
            Matcher stacja = null;
            List<String> output = new ArrayList<>();
            try {
                doc = Jsoup.connect("https://kmkbike.pl/panel/station-map/").get();
              
                mt = doc.select("script").last().previousElementSibling();

                i = Pattern.compile("\\d{1,2}\\/\\d{1,2}");
                n = Pattern.compile("<h3>(.*)<\\/h3>");
                ilosc = i.matcher(mt.html());
                stacja = n.matcher(mt.html());
                

                
                while (ilosc.find() && stacja.find()) {
                    output.add(stacja.group(1));
                    
                    output.add(ilosc.group());
                  
                }
               
            } catch (IOException e) {
                e.printStackTrace();
            }
            Log.d(TAG, "OUTPUT");
            return output;

        }

        protected void onPostExecute(List<String> output) {
            pd.dismiss();

            ListView lv = (ListView) findViewById(R.id.listView);
            lv.setAdapter((new ArrayAdapter<String>(MainActivity.this,
                    android.R.layout.simple_list_item_1, output)));
          


        }
    }
  • Вопрос задан
  • 469 просмотров
Решения вопроса 1
@UltimateOrb
1. Вы забываете что Java это объектно ориентированный язык программирования. Станцию можно рассматривать как объект, а ее имя и кол-во свободных велосипедов как свойства.

public class Stantion {
    String mName;
    int mCount;
    
    public Stantion (String name, int count) {
        mName = name;
        mCount = count;
    }
}


2. List может состоять не только из строк. Можно сделать список станций и добавлять в него новые элементы.

public class Parse extends AsyncTask <String, Void, ArrayList<Stantion>> {

    @Override
    protected ArrayList<Stantion> doInBackground(String... strings) {
        ArrayList<Stantion> items = new ArrayList<>();

        // Parse...

        while (...) {
            String name = stacja.group(1);
            int count = ilosc.group();
            items.add(new Stantion(name, count));
        }

        return items;
    }
}


3. Для отображения списка в не стандартном стиле, нужно написать свой адаптер. В интернете много примеров. Можно посмотреть в сторону ArrayAdapter.

public class MyAdapter extends ArrayAdapter<Stantion> {
       
     // Реализация адаптера

}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы