Здравствуйте, разработчики! Сегодня мы создадим приложение для Android, которое будет получать данные JSON с сервера с помощью Volley Theme.MaterialComponents.NoActionBart для передачи данных в RecylerView.

Прежде чем мы начнем: Я использую Ubuntu Linux, а также использую XAMPP в качестве сервера, поэтому убедитесь, что XAMPP установлен в вашей системе, или просто поместите данные JSON в Ваш сайт. И для этого урока я использую Android Studio RC 3.0.

YouTube видео:

Наш окончательный результат:

Как будет выглядеть JSON:

[
 {
 “title”: “Dawn of the Planet of the Apes”,
 “rating”: 8.3,
 “releaseYear”: 2014
 },
 //……
]

Корнем JSON является «[», а все данные заключаются в «{».

“title” = String  
“rating” = int
“releaseYear” = int

Давайте код

Шаг 1) Создайте новый проект Android Studio и добавьте эти зависимости в build.gradle на уровне приложения.

compile 'com.android.volley:volley:1.0.0'
compile 'com.android.support:design:26.1.0'
implementation 'com.android.support:appcompat-v7:26.1.0'

Шаг 2) Откройте activity_main.xml и добавьте атрибут RecylerView.

<android.support.v7.widget.RecyclerView
    android:id="@+id/main_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>

Шаг 4) Создайте новый класс Java, назовите его Movie и измените его с помощью кода ниже.

package example.androidgrid.volleyexample;

/**
 * Created by ankit on 27/10/17.
 */

public class Movie {

    public String title;
    public int rating;
    public int year;

    public Movie() {

    }

    public Movie(String title, int rating, int year) {
        this.title = title;
        this.rating = rating;
        this.year = year;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getRating() {
        return rating;
    }

    public void setRating(int rating) {
        this.rating = rating;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }
}

Шаг 5) Создайте новый класс Java для адаптера, назовите его MovieAdapter и измените его с помощью приведенного ниже кода.

package example.androidgrid.volleyexample;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

/**
 * Created by ankit on 27/10/17.
 */

public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.ViewHolder> {

    private Context context;
    private List<Movie> list;

    public MovieAdapter(Context context, List<Movie> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.single_item, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Movie movie = list.get(position);

        holder.textTitle.setText(movie.getTitle());
        holder.textRating.setText(String.valueOf(movie.getRating()));
        holder.textYear.setText(String.valueOf(movie.getYear()));

    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView textTitle, textRating, textYear;

        public ViewHolder(View itemView) {
            super(itemView);

            textTitle = itemView.findViewById(R.id.main_title);
            textRating = itemView.findViewById(R.id.main_rating);
            textYear = itemView.findViewById(R.id.main_year);
        }
    }

}

Шаг 6) Вы можете получить сообщение об ошибке R.layout.single_item, чтобы исправить это, создайте новый макет, назовите его single_item и добавьте в него код ниже.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dp">

    <TextView
        android:id="@+id/main_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Title"
        android:textSize="18sp"/>


    <TextView
        android:id="@+id/main_rating"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Rating"/>

    <TextView
        android:id="@+id/main_year"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Year"/>
</LinearLayout>

Шаг 7) Добавьте ниже переменные в MainActivity.java

private RecyclerView mList;

private LinearLayoutManager linearLayoutManager;
private DividerItemDecoration dividerItemDecoration;
private List<Movie> movieList;
private RecyclerView.Adapter adapter;

Шаг 8) Объявите переменные

mList = findViewById(R.id.main_list);

movieList = new ArrayList<>();
adapter = new MovieAdapter(getApplicationContext(),movieList);

linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
dividerItemDecoration = new DividerItemDecoration(mList.getContext(), linearLayoutManager.getOrientation());

mList.setHasFixedSize(true);
mList.setLayoutManager(linearLayoutManager);
mList.addItemDecoration(dividerItemDecoration);
mList.setAdapter(adapter);

Шаг 9) Если вы используете, поместите файл JSON в /htdocs/Volley/. Если вы используете настоящий веб-сайт и контролируете FTP, разместите его на своем веб-сайте.

Шаг 10) Если вы используете настоящий веб-сайт со своим собственным доменом, если вы находитесь в XAMPP, вам нужен IP-адрес сервера вместо localhost. Чтобы получить IP-адрес: если вы используете Windows / Mac, используйте ipconfig вместо этого, если вы используете Linux, как я, используйте ifconfig для получения IP-адреса.

Шаг 11) Теперь, когда у вас есть адрес сервера, создайте новую строковую переменную для MainActivity.java

private String url = "http://192.168.43.196/Volley/data.json";

Шаг 12) Теперь мы извлечем данные, создадим новый метод в MainActivity.java и воспользуемся приведенным ниже кодом.

private void getData() {
    final ProgressDialog progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("Loading...");
    progressDialog.show();

    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {
            for (int i = 0; i < response.length(); i++) {
                try {
                    JSONObject jsonObject = response.getJSONObject(i);

                    Movie movie = new Movie();
                    movie.setTitle(jsonObject.getString("title"));
                    movie.setRating(jsonObject.getInt("rating"));
                    movie.setYear(jsonObject.getInt("releaseYear"));

                    movieList.add(movie);
                } catch (JSONException e) {
                    e.printStackTrace();
                    progressDialog.dismiss();
                }
            }
            adapter.notifyDataSetChanged();
            progressDialog.dismiss();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("Volley", error.toString());
            progressDialog.dismiss();
        }
    });
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(jsonArrayRequest);
}

Шаг 12) Выполните метод в onCreate ()

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    /.................
    getData();
}

Шаг 14) Теперь ваш MainActivity.java будет выглядеть примерно так

package example.androidgrid.volleyexample;

import android.app.ProgressDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private String url = "http://192.168.43.196/Volley/data.json";

    private RecyclerView mList;

    private LinearLayoutManager linearLayoutManager;
    private DividerItemDecoration dividerItemDecoration;
    private List<Movie> movieList;
    private RecyclerView.Adapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mList = findViewById(R.id.main_list);

        movieList = new ArrayList<>();
        adapter = new MovieAdapter(getApplicationContext(),movieList);

        linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        dividerItemDecoration = new DividerItemDecoration(mList.getContext(), linearLayoutManager.getOrientation());

        mList.setHasFixedSize(true);
        mList.setLayoutManager(linearLayoutManager);
        mList.addItemDecoration(dividerItemDecoration);
        mList.setAdapter(adapter);

        getData();
    }

    private void getData() {
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Loading...");
        progressDialog.show();

        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                for (int i = 0; i < response.length(); i++) {
                    try {
                        JSONObject jsonObject = response.getJSONObject(i);

                        Movie movie = new Movie();
                        movie.setTitle(jsonObject.getString("title"));
                        movie.setRating(jsonObject.getInt("rating"));
                        movie.setYear(jsonObject.getInt("releaseYear"));

                        movieList.add(movie);
                    } catch (JSONException e) {
                        e.printStackTrace();
                        progressDialog.dismiss();
                    }
                }
                adapter.notifyDataSetChanged();
                progressDialog.dismiss();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Volley", error.toString());
                progressDialog.dismiss();
            }
        });
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(jsonArrayRequest);
    }
}

Шаг 15) Наконец, добавьте разрешение на Интернет в манифесте

<uses-permission android:name=”android.permission.INTERNET”/>

Шаг 16) Создайте и протестируйте приложение в эмуляторе или используйте настоящее устройство, если вы используете настоящий веб-сайт. Хлопайте и комментируйте, если у вас возникли проблемы с этим кодом. Следуйте за мной в Instagram www.instgram.com/ankit_suda

Посетите сайт моего брата, чтобы получить информацию о диете и упражнениях: My Beast Life

Исходный код

https://app.box.com/s/x7cuuxddtx5bijk824w4isfpawp28zq8