Здравствуйте, разработчики! Сегодня мы создадим приложение для 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