Всем привет, и сегодня мы продолжим рассматривать возможности работы с json файлами в Android Studio.

На этот раз будем использовать listView для отображения данных, хочу напомнить, что в прошлом видео мы работали с recyclerview и cardview, и сегодня будем делать макет попроще, будет иной принцип подключения файла json со списком.

Подобный пример можно использовать в качестве различных справочных андроид приложений, для курсовых и дипломных работ, храня данные в локальном файле, так что приятного просмотра, будет интересно.

Смотрите видео: Android Studio: получение JSON в ListView и ArrayAdapter. Урок № 2

Давайте создадим новый проект с пустой активностью, дадим названием, как вы помните в прошлый раз проект назывался Load Json from assets -01, назовем также с цифрой два, Load Json from assets -02.

Проект у нас загружен, и давайте создадим папку assets для json файла, создадим новый файл users.json, на этот раз вставим значение, но без имени массива users, сейчас поработаем с безымянном массивом, позже я покажу как работать с этим файлом, сохраним, закроем файл.

[
  {
    "id": "1",
    "name": "Коля",
    "email": "qwerty@ gmail.com" //пробелы в почте специально!!! при копировании удалить вместе с комментом
  },
  {
    "id": "2",
    "name": "Вася",
    "email": "abc@ gmail.com"
  },
  {
    "id": "3",
    "name": "Федя",
    "email": "def@ gmail.com"
  },
  {
    "id": "4",
    "name": "Юра",
    "email": "xyz@ gmail.com"
  }
]

Откроем activity_main.xml, заменим виджет ConstraintLayout на RelativeLayout, а TextView изменения на ListView. Уберём отсюда всё лишнее и добавим Android:id ListView.

Список ListView будет для общего плана, а для пунктов списка создадим в папке layout ещё один Resource File, как и в прошлом примере назавем его row.xml. Заменим в разметке RelativeLayout, id не нужен, добавим отступы 6dp.

Слой listview

Внутри RelativeLayout добавим LinearLayout, ориентация – вертикальная, внутренний отступ – 5dp.

Так же добавим два TextView с id, name и email, соответственно, размер текста – 30sp.

Для RelativeLayout и LinearLayout установим ширину - match_parent, высоту - wrap_content, с разметкой закончили.

Слой row

Переходим в MainActivity, объявим переменную типа ListViewlistview, обратимся к элементу экрана из кода через findviewbyid

listView = findViewById(R.id.listView).

Давайте создадим новый класс которая нас будет отвечать за работу с данными в json файле и списком.

Назовем его UserAdapter, адаптер будет наследоваться от

extends ArrayAdapter< JSONObject >

Нам нужна будет int переменная listLayout, ArrayList< JSONObject > list и как уже говорилось контекст, Context context.

Далее напишем конструктор

public UserAdapter(Context context, int listLayout, int field ,ArrayList< JSONObject > list)
затем

super(context,listLayout,field,list).

Напишем присвоение переменных

this.context=context;
this.listLayout=listLayout;
this.list=list;

Ну теперь нам нужно будет сделать, как мы в прошлый раз делали, получение нашего View, создадим Layout inflator, который будет обращаться к объекту, к нашему файлу разметки row.xml для отображения пунктов списка.

public View getView(int position, View convertView, ViewGroup parent){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(listLayout,parent,false);
        TextView name = itemView.findViewById(R.id.name);
        TextView email = itemView.findViewById(R.id.email);
        try {
            name.setText(list.get(position).getString("name"));
            email.setText(list.get(position).getString("email"));
        }catch (JSONException e){
            e.printStackTrace();
        }
        return itemView;
    }

Вот так у нас выглядит наш обработчик, здесь получилось, что мы меньше писали кода в классе UserAdapter чем в прошлом примере.

Теперь перейдем в mainactivity и продолжим, поскольку у нас массив users.json безымянный, нам проще обратиться к нашему файлу, чем если бы он имел имя.

Пишем в onCreate

JSONArray jsonArray = getJSonData("users.json");

И ниже, вне onCreate напишем функцию getJSonData

private JSONArray getJSonData(String filename)
она будет принимать имя файла filename.

Объявим переменную и проинициализируем ее.

JSONArray jsonArray = null

В блоке обработки исключений try/catch получим содержимое файла

InputStream inputStream = getResources().getAssets().open(filename);

Узнаем размер

int size = inputStream.available();

создадим массив байт

byte[] data = new byte[size];

прочитаем его

inputStream.read(data);

закроем

inputStream.close();

Далее в строковую переменную String json поместим значение переменной data в формате как Вы уже догадались UTF-8

String json = new String(data,"UTF-8");

И теперь в переменную jsonArray поместим массив из строковой переменной json.

jsonArray = new JSONArray(json);

В обработке исключений IOException переменная e, и e.printStackTrace().

Еще один блок Catch теперь исключение JSONException js, и js.printStackTrace().

Наша функция должна вернуть return jsonarray.

Функция, которая будет обрабатывать наш json файл у нас уже есть. теперь нам нужно будет написать ещё один обработчик работы с ListView для вывода наших данных.

Давайте ещё напишем приватную функцию

private ArrayList< JSONObject > getArrayListFromJSONArray(JSONArray jsonArray)

в качестве параметра буду передавать JSONArray переменная jsonArray

Создадим

ArrayList< JSONObject > aList = new ArrayList< JSONObject >();

Это будет возвращаемая переменная в конце, а пока она будет для накопления данных из ArrayList.

Снова блок try/catch, в try мы напишем если jsonArray не равно null,

if(jsonArray!= null)

то в цикле for

for(int i = 0; i< jsonArray.length();i++){
aList.add(jsonArray.getJSONObject(i));
}

В наш aList через метод add - добавить, будем наполнять из jsonArray.getJSONObject. Снова блок исключения,

catch (JSONException js){
            js.printStackTrace();

возвращаемое значение return alist.

Вот что у нас получилось, с основной частью мы закончили, возвращаемся в это место и вернёмся к нашей функции onCreate.

Напишем

ArrayList< JSONObject > listItems = getArrayListFromJSONArray(jsonArray)
ListAdapter adapter = new UserAdapter(this, R.layout.row,R.id.name,listItems)
listIView.setAdapter(adapter)

Так у нас выглядит весь код, сохранимся. Можно попробовать запустить его на выполнение в эмуляторе, он запустился у меня на другом мониторе и вот у нас получились элементы списка с именами Коля, Вася, Федя, Юра и их почтовые адреса.

JSON список из безымянного массива

Мы добились того, чего хотели, применили для вывода из json элемент listView вместо recyclerview и cardview.

В нашем gradle файле ничего как видите не указано из прошлого видео примера.

Теперь давайте сделаем наш массив именным, и как нам получить из него данные назовем его users, вот так у нас выглядел бы наш массив, как прошлом примере.

{"users":[
  {
    "id": "1",
    "name": "Коля",
    "email": "qwerty@ gmail.com" //пробелы в почте специально!!! при копировании удалить вместе с комментом
  },
  {
    "id": "2",
    "name": "Вася",
    "email": "abc@ gmail.com" 
  },
  {
    "id": "3",
    "name": "Федя",
    "email": "def@ gmail.com" 
  },
  {
    "id": "4",
    "name": "Юра",
    "email": "xyz@ gmail.com" 
  }
]}

Если запустить приложение в списке ничего нет. Вроде один и тот код, и файл тот же, но ничего не происходит. Давайте теперь перепишем функцию так, чтобы нам возвращалась значение из именного массива.

Значит это часть у нас пока останется, поскольку здесь у нас возвращается массив, нам нужно будет получить строки.

Для этого нам нужно будет изменить код следующим образом напишем блок try/catch

JSONObject jsonObject = new JSONObject(getJSonData("users.json")).

И обратимся к массиву users внутри json файла

jsonArray = jsonObject.getJSONArray("users");
catch (JSONException e){
            e.printStackTrace();

Закомментируем строку из первого примера, теперь getJSonData у нас должно возвращать строковое значение, давайте вот так если мы захотим вернуться, то нам нужно будет изменить JSONArray на String

private String getJSonData(String filename){

jsonArray давайте я тоже закомментирую, продублирую и изменю тип на String

String json = null;

и закомментируем здесь

//jsonArray = new JSONArray(json);

Удалим блок исключения JSONExeption, и теперь функция возвращает строковое значение.

Теперь можно запустить по новой и посмотреть, что получится в итоге. Как видите при таком способе у нас из json файла с именем массива users получены данные.

JSON список из именного массива

Если мы теперь опять уберём имя массива, то естественно у нас больше ничего работать не будет потому такие нюансы нужно учитывать при работе с json.

Cкачать архив для ознакомления - Android Studio: получение JSON в ListView и ArrayAdapter. Урок № 2:


ZIP архив с проектом


Полный текст activity_main.xml

< ?xml version="1.0" encoding="utf-8"?>
< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    < ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView"/>

< /RelativeLayout>

Полный текст row.xml

< ?xml version="1.0" encoding="utf-8"?>
< RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="6dp">

    < LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="5dp">
        < TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="name"
            android:textSize="30sp"/>

        < TextView
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="name"
            android:textSize="30sp"/>
    < /LinearLayout>

< /RelativeLayout>

Полный текст MainActivity.java

package ru.maxfad.loadjsonfromassets_02;

import android.os.Bundle;
import android.widget.ListAdapter;
import android.widget.ListView;
import androidx.appcompat.app.AppCompatActivity;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ListView listView;
    JSONArray jsonArray;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = findViewById(R.id.listView);
        try {
            JSONObject jsonObject = new JSONObject(getJSonData("users.json"));
            jsonArray = jsonObject.getJSONArray("users");
        }catch (JSONException e){
            e.printStackTrace();
        }
        ArrayList< JSONObject> listItems = getArrayListFromJSONArray(jsonArray);
        ListAdapter adapter = new UserAdapter(this,R.layout.row,R.id.name,listItems);
        listView.setAdapter(adapter);
    }

    //private JSONArray getJSonData(String filename){
    private String getJSonData(String filename){
     //JSONArray jsonArray = null;
     String json = null;
     try {
         InputStream inputStream = getResources().getAssets().open(filename);
         int size = inputStream.available();
         byte[] data = new byte[size];
         inputStream.read(data);
         inputStream.close();
         json = new String(data,"UTF-8");
         //jsonArray = new JSONArray(json);
     }catch (IOException e){
         e.printStackTrace();
     }
        //return jsonArray;
        return json;
    }
    private ArrayList< JSONObject> getArrayListFromJSONArray(JSONArray jsonArray){
        ArrayList< JSONObject> aList = new ArrayList< JSONObject>();
        try {
            if(jsonArray!= null){
                for(int i = 0; i< jsonArray.length();i++){
                    aList.add(jsonArray.getJSONObject(i));
                }
            }
        }catch (JSONException js){
            js.printStackTrace();
        }
        return aList;
    }
}

Полный текст UserAdapter.java

package ru.maxfad.loadjsonfromassets_02;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;

public class UserAdapter extends ArrayAdapter< JSONObject> {
    int listLayout;
    ArrayList< JSONObject> list;
    Context context;

    public UserAdapter(Context context, int listLayout, int field ,ArrayList< JSONObject> list){
        super(context,listLayout,field,list);
        this.context=context;
        this.listLayout=listLayout;
        this.list=list;
    }

    public View getView(int position, View convertView, ViewGroup parent){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(listLayout,parent,false);
        TextView name = itemView.findViewById(R.id.name);
        TextView email = itemView.findViewById(R.id.email);
        try {
            name.setText(list.get(position).getString("name"));
            email.setText(list.get(position).getString("email"));
        }catch (JSONException e){
            e.printStackTrace();
        }
        return itemView;
    }
}

Смотрите видео: Android Studio: получение JSON в ListView и ArrayAdapter. Урок № 2

 С уважением, авторы сайта Компьютерапия




Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!

Связанные статьи

Предыдущие статьи

We use cookies on our website. Some of them are essential for the operation of the site, while others help us to improve this site and the user experience (tracking cookies). You can decide for yourself whether you want to allow cookies or not. Please note that if you reject them, you may not be able to use all the functionalities of the site.

Ok