Всем привет, и сегодня мы продолжим рассматривать возможности работы с json файлами в Android Studio.
На этот раз будем использовать listView для отображения данных, хочу напомнить, что в прошлом видео мы работали с recyclerview и cardview, и сегодня будем делать макет попроще, будет иной принцип подключения файла json со списком.
Подобный пример можно использовать в качестве различных справочных андроид приложений, для курсовых и дипломных работ, храня данные в локальном файле, так что приятного просмотра, будет интересно.
Android Studio получение JSON в ListView и ArrayAdapter. Урок № 2
Android Studio получение JSON в ListView и ArrayAdapter. Урок № 2
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.
Внутри RelativeLayout добавим LinearLayout, ориентация – вертикальная, внутренний отступ – 5dp.
Так же добавим два TextView с id, name и email, соответственно, размер текста – 30sp.
Для RelativeLayout и LinearLayout установим ширину - match_parent, высоту - wrap_content, с разметкой закончили.
Переходим в MainActivity, объявим переменную типа ListView – listview, обратимся к элементу экрана из кода через 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 элемент 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.
Cкачать архив для ознакомления - Android Studio: получение JSON в ListView и ArrayAdapter. Урок № 2:
Полный текст 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
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в YouTube, там Вы найдете много интересного видео, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилось? Поделись этим видео с друзьями!
Android Studio получение JSON в ListView и ArrayAdapter. Урок № 2
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на видео ВКонтакте, там Вы найдете много интересного, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилось? Поделись этим видео с друзьями!
Android Studio получение JSON в ListView и ArrayAdapter. Урок № 2
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в Рутубе, там Вы найдете много интересного, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилось? Поделись этим видео с друзьями!