Всем привет, в этой статье я расскажу вам, как в Android Studio можно работать с json файлами.
Это будет первая статья, поскольку есть различия в работе с json, существует массив с именем, или не именной, можно выводить данные в recyclerview или listview, поэтому будут различные подходы в парсинге.
Android Studio получение JSON в RecyclerView и CardView. Урок № 1
Android Studio получение JSON в RecyclerView и CardView. Урок № 1
Android Studio получение JSON в RecyclerView и CardView. Урок № 1
Это будет первая статья, затем мы перейдём к парсингу JSON файлов с хостинга. Но это будет немного позже начнем с самого простого примера, локального файла в папке assets.
Создадим новый проект, выбираем empty Activity, давайте назовём приложение, например, Load Json from assets-01.
Идёт подготовка проекта, в нем мы будем использовать не listView будем использовать recyclerview и cardview.
А пока, если хотите можете поставить на паузу ролик и повторять то, что я пишу, и какие изменения делаю.
В файл build.gradle проекта внесем записи
implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'androidx.cardview:cardview:1.0.0'
это recyclerview и cardview для вывода данных и синхронизируем проект.
Всё хорошо, теперь займемся работой с нашими слоями в activity_main.xml введем RelativeLayout а в него androidx.recyclerview.widget с android:id="@+id/recyclerView".
Не будем делать фрагменты, в данном примере будет при запуске сразу отображаться нужная информация.
Создадим еще один слой назовем его row.xml в нем androidx.cardview.widget.CardView, LinearLayout с двумя TextView с android:id="@+id/name" и android:id="@+id/email" соответственно.
Хочу рассказать о json файле с которым будем работать, он состоит из идентификатора пользователя (id), имени пользователя (name) и электронной почты (email), то есть начнём с простейшего примера и далее будем это всё выводить.
{"users":[
{
"id":"1",
"name": "Коля",
"email":"daaksha@ gmail.com" //пробелы в почте специально!!! при копировании удалить вместе с комментом
},
{"id":"2",
"name": "Вася",
"email":"abc@ gmail.com"
},
{"id":"3",
"name": "Федя",
"email":"def@ gmail.com"
},
{"id":"4",
"name": "Юра",
"email":"xyz@ gmail.com"
}
]
}Создадим в папке проекта New File Folder дикторию assets, и в ней нужно будет создать файл users.json.
Я заполнил его такими данными, название нашего массива – users, в нем поля - id, name, email, чисто случайные данные, для наглядности. В принципе больше нечего с ним мы делать не будем.
Теперь поработаем в файле mainactivity.java. Нам нужно будет объявить переменную recyclerView с типом RecyclerView перед onCreate, нужно связать список через findViewById(R.id.recyclerView).
Опишем LinearLayoutManager:
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext())
и передадим управление recyclerView
recyclerView.setLayoutManager(linearLayoutManager).
Так же нужно будет создать новый класс Java New Class, назовем его HelperAdapter для работы со списком, с данными json.
Он будет наследоваться от
RecyclerView.Adapter< HelperAdapter.MyViewClass >
MyViewClass мы напишем позже.
Выглядит это всё достаточно сложно на первый взгляд, но потом можно будет использовать этот код, вносить небольшие правки в именах полей и тому подобном. Делается практически один раз и нам не нужно будет создать каждый раз для аналогичных проектов.
Создаем
ArrayList< String > name; ArrayList< String > email;
для хранения имя и почты пользователей из users.json файла, поле id использовать в этом примере не будем.
Также объявим переменную для контекста,
Context context;
будем определять его для работы с mainactivaty.
В конструкторе HelperAdapter
public HelperAdapter(ArrayList< String > name, ArrayList< String > email, Context context) {
this.name = name;
this.email = email;
this.context = context;
}
Соединим наши ранее объявленные переменный с классом, соответственно здесь присваиваются эти переменные.
В onCreateViewHolder, мы сделаем layout inflator, будем передавать ему данные, укажем что у нас ключевым для вывода данных является row.xml файл, в который будет все значения попадать.
Теперь давайте чтобы меньше было красных подчеркиваний, создадим всё-таки MyViewClass, спустим его ниже, выглядит он будет вот так:
public class MyViewClass extends RecyclerView.ViewHolder{
TextView name;
TextView email;
public MyViewClass(@NonNull View itemView) {
super(itemView);
name = itemView.findViewById(R.id.name);
email = itemView.findViewById(R.id.email);
}
}
MyViewClass наследуется от recyclerview viewholder объявляем переменные для имя и почты, в принципе это можно уже убрать, как бы понятно и передаем данные в пункт списка.
Нужно будет знать количество записей, сделать это можно чуть выше,
@Override
public int getItemCount() {
return name.size();
}
И ещё нам здесь осталось добавить onBindViewHolder в котором при нажатии на сам список будет появляться всплывающий текст.
Теперь перейдём в файл mainactivity.java, в ней будем работать с json объектами и массивами.
Нужно будет json файл получить в переменную jsonObject. Поскольку у нас ещё не написана JsonDataFromAsset функция, давайте её здесь вставлю, покажу и расскажу как она работает.
Поскольку будем базироваться в следующих видео тоже на похожем коде, то давайте разберемся как работает эта функция.
Мы передаем ей имя нашего json файла здесь у нас возвращается строковое значение, дальше разбор массива произойдет в цикле, try/catch - обработка исключений, здесь мы пробегаем по всему массиву через
getAssets().open(fileName)
открываем его в inputstream входящий поток, определяем размер, создаем массив байтов, передаём этот массив байтов через чтение из inputstream.
Закрываем поток, в переменную json в строковом виде в формате utf-8 наша функция JsonDataFromAsset будет возвращать данные.
Теперь из объекта получаем массив, обратите внимание данную конструкцию нужно обрабатывать через try/catch с исключениями, потому как здесь будет работать ещё цикл.
В цикле for мы будем пробегать по-нашему массиву ну и соответственно
JSONObject userData=jsonArray.getJSONObject(i);
и передадим в name и в email
name.add(userData.getString("name"));
email.add(userData.getString("email"));наши значения.
Так ну и после мы вызываем
HelperAdapter helperAdapter = new HelperAdapter(name,email,MainActivity.this);
и зададим
recyclerView.setAdapter(helperAdapter);
Перед onCreate зададим два ArrayList
ArrayList< String > name = new ArrayList<>(); ArrayList< String > email = new ArrayList<>();
Как делали это в HelperAdapter.
Ну вот и всё, разбираем файл, передаем в массив, получаем данные. Короче ничего сверхсложного)) Сохраняем проект, запускаем на эмуляторе.
Последние штрихи, исправим высоту
androidx.cardview.widget.CardView
на
android:layout_height="wrap_content"
и LinearLayout
android:layout_height="wrap_content"
и сохранить.
Итак мы рассмотрели в двух словах, как работать с локальным json файлом, который находится в папке assets, и вывели данные через recyclerview и cardview.
Существует способ создания json файла, в котором нет имени массива, а сразу идут через запятую блоки данных, и данный код с ним работать не будет.
С каким вариантом будете работать именно вы, решать вам, а в следующей статье и видео и рассмотрим именно этот случай, кроме того использовать будем listview для отображения данных.
В общем, если вы ничего не поняли, то ожидайте выход новых статей и видео и подписывайтесь на канал в YouTube.
Федя, Вася, Юра, Коля – всем привет)
Cкачать архив для ознакомления - Android Studio: получение JSON в RecyclerView и CardView. #1:
Полный текст 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">
< androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recyclerView"/>
< /RelativeLayout>
Полный текст row.xml
<?xml version="1.0" encoding="utf-8"?>
< androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/cardView"
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="email"
android:textSize="30sp"/>
< /LinearLayout>
< /androidx.cardview.widget.CardView>
Полный текст MainActivity.java
package ru.maxfad.loadjsonfromassets_01;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
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 {
RecyclerView recyclerView;
ArrayList< String > name = new ArrayList<>();
ArrayList< String > email = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(linearLayoutManager);
try {
JSONObject jsonObject = new JSONObject(JsonDataFromAsset("users.json"));
JSONArray jsonArray = jsonObject.getJSONArray("users");
for (int i=0;i< jsonArray.length();i++){
JSONObject userData=jsonArray.getJSONObject(i);
name.add(userData.getString("name"));
email.add(userData.getString("email"));
}
} catch (JSONException e) {
e.printStackTrace();
}
HelperAdapter helperAdapter = new HelperAdapter(name,email,MainActivity.this);
recyclerView.setAdapter(helperAdapter);
}
private String JsonDataFromAsset(String fileName) {
String json = null;
try {
InputStream inputStream = getAssets().open(fileName);
int sizeOfFile = inputStream.available();
byte[] bufferData = new byte[sizeOfFile];
inputStream.read(bufferData);
inputStream.close();
json = new String(bufferData, "UTF-8");
}catch (IOException e){
e.printStackTrace();
return null;
}
return json;
}
}
Полный текст HelperAdapter.java
package ru.maxfad.loadjsonfromassets_01;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class HelperAdapter extends RecyclerView.Adapter< HelperAdapter.MyViewClass > {
ArrayList< String > name;
ArrayList< String > email;
Context context;
public HelperAdapter(ArrayList< String > name, ArrayList< String > email, Context context) {
this.name = name;
this.email = email;
this.context = context;
}
@NonNull
@Override
public MyViewClass onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row,parent,false);
MyViewClass myViewClass=new MyViewClass(view);
return myViewClass;
}
@Override
public void onBindViewHolder(@NonNull MyViewClass holder, int position) {
holder.name.setText(name.get(position));
holder.email.setText(email.get(position));
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"Item Clicked",Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return name.size();
}
public class MyViewClass extends RecyclerView.ViewHolder{
TextView name;
TextView email;
public MyViewClass(@NonNull View itemView) {
super(itemView);
name = itemView.findViewById(R.id.name);
email = itemView.findViewById(R.id.email);
}
}
}
Android Studio получение JSON в RecyclerView и CardView. Урок № 1
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в YouTube, там Вы найдете много интересного видео, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилось? Поделись этим видео с друзьями!
Android Studio получение JSON в RecyclerView и CardView. Урок № 1
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на видео ВКонтакте, там Вы найдете много интересного, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилось? Поделись этим видео с друзьями!
Android Studio получение JSON в RecyclerView и CardView. Урок № 1
Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в Рутубе, там Вы найдете много интересного, которое выходит достаточно часто. Приятного просмотра!
С уважением, авторы сайта Компьютерапия
Понравилось? Поделись этим видео с друзьями!