شرح مكتبة Retrofit في الاندرويد
طريقة استخدام مكتبة Retrofit HTTP Library في الاندرويد وسنشرح ماهي مكتبة Retrofit HTTP Library ؟ بالاضافةإلى مثال بسيط على كيفية استخدام Retrofit HTTP Library وتقوم بنفس هذه المكتبة بنفس وضائف مكتبة Volley ولكن مع بعض الاختلافات.كثيرا مانقوم بإنشاء تطبيقات اندرويد تقوم بالاتصال بالإنترنت حيث إن أغلب التطبيقات التي نستخدمها في يومنا هذا تعتمد أعتمادا كاملا على الاتصال بالإنترنت لذلك سنقوم بشرح كيفية استخدام مكتبة Retrofit HTTP Library في الاندرويد .
كثيرا ما تواجهه المبرمجين بعض الصعوبات في كتابة الكود الخاص بالاتصال بالإنترنت وجلب البيانات منه .. لكن سنتعلم في درس اليوم كيفية تسهيل عملية الاتصال بالانترنت وذلك فب خطوات بسيطة وسهلة باستخدام مكتبة Retrofit HTTP Library.
ماهي مكتبة Retrofit HTTP Library
مثال على استخدام مكتبة Android HTTP Retrofit
وسيكون الـ output من هذا المثال كما في الصورة ادناه :-
أولا سنحتاج لمصدر تلك البيانات وسنحصل على تلك البيانات من هذا الرابط : http://muteetechbot.esy.es/api/Students.json
[
{
"student_Id":"1",
"student_name":"Ahmed",
"class":"4",
"age":9
},
{
"student_Id":"2",
"student_name":"Saleh",
"class":"9",
"age":14
},
{
"student_d":"3",
"student_name":"Ali",
"class":"7",
"age":12
},
{
"student_d":"4",
"student_name":"essa",
"class":"7",
"age":11
}
]
ونبدا الان المثال بالخطوات التالية:-
1-نفتح اندرويد استديو ونقوم بانشاء مشروع جديد نسميه RetrofitExample .
ونقوم بإنشاء Activity شاشة جديدة نسميها StudentDetails .. بحيث يحتوي مشروعنا الان على شاشتين واحدة لعرض إسماء الطلاب والاخرى لعرض بيانات الطالب.
2 -نقوم باضافة مكتبة Retrofit إلى مشروع وذلك باضافة الـ dependency الخاص بها في ملف build.gradle كما في الكود ادناه:
compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.0.2'
3-نقوم بالذهاب إلى ملف Manifest.xmlونضيف صلاحية الوصول إلى الانترنت وذلك لإننا نستخدم تطبيق يتصل بالانترنت فلابد من اضافة هذه الصلاحية كمافي الكود ادناه:
<uses-permission android:name="android.permission.INTERNET" />
4- نقوم الان بتصميم واجهات التطبيق وذلك عبر الخطوات الاتية:
1.4- نقوم بالذهاب إلى مجلد res<layout ومن ثم نفتح ملف activity_mai.xml ونقوم باضافة ListView لعرض اسماء الطلاب كمافي الكود ادناه:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <ListView android:id="@+id/listViewStudents" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".StudentDetails">
<TextView
android:id="@+id/textViewStudentId"
android:textSize="24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=" ID : "/>
<TextView
android:id="@+id/textViewStudentName"
android:textSize="24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Name : "/>
<TextView
android:id="@+id/textViewStudentClass"
android:textSize="24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Leve : "/>
<TextView
android:id="@+id/textViewStudentAge"
android:textSize="24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Age : "/>
</LinearLayout>
package com.blogspot.muteealjabri.shorttest;
import com.google.gson.annotations.SerializedName;
/**
* Created by mutee on 08/03/2016.
*/
public class Student {
@SerializedName("student_Id")
private String student_Id;
@SerializedName("student_name")
private String student_name;
@SerializedName("class_id")
private String level;
@SerializedName("age")
private String age;
//Getters and setters
public String getStudentId() {
return student_Id;
}
public void setStudentId(String student_Id) {
this.student_Id = student_Id;
}
public String getStudentName() {
return student_name;
}
public void setStudentName(String name){
this.student_name = name;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
ملاحظات:
1-عند إنشاء model class فقط نقوم بتعريف المتغيرات التي نريد الحصول عليها من Json feed .
في مثالنا الـ Json feed يحتوي على رقم الطالب واسمه ومستواه والعمر .. فلذلك قمنا بإنشاء model class يحتوي فقط على تلك البيانات.
2- يجب عليك تعريف Setters and Getters لتلك المتغيرات(مهم جدا).
6.2-نقوم بإنشاء Java Interface لارسال طلب HTTP Request باستخدام Retrofit.
نقوم بإنشاء Java Interface تقوم بارسال طلب request الحصول على البيانات من Json feed ونسميها StudentAPI كمافي الكود ادناه:
package com.blogspot.muteealjabri.retrofitexample;
import java.util.List;
import retrofit.Callback;
import retrofit.http.GET;
/**
* Created by Mutee on 2/8/2016.
*/
public interface StudentAPI {
/*Retrofit get annotation with our URL
And our method that will return us the list of students info
*/
@GET("api/Student.json")
public void getStudents(Callback<List<Student>> response);
}
نلاحظ من الكود اعلاه مايلي:
-تم إرسال طلب باستخدام الميثود Get وتم اسناد المسار api/Student.json وذلك لان في مكتبة retrofit لايمكنك وضع الرابط كله وتم استثناء الـ root من الرابط وهو http://muteetechbot.esy.es.. وسيتم التعامل مع الرابط كاملا في MainActivity .
- تم تعريف دالة اسمها getStudents وتمرير لها callBack method وتحتوي على قائمة List من البيانات التي نريد الحصول عليها وهي بيانات الطلاب.
7.2-نقوم بالذهاب إلى MainActivity وسيتم في هذه الشاشة عرض البيانات في ListView كما في الكود ادناه :-
package com.blogspot.muteealjabri.shorttest;
import android.app.ProgressDialog;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity implements OnItemClickListener {
public static final String KEY_STUDENT_ID = "id";
public static final String KEY_STUDENT_NAME = "name";
public static final String KEY_STUDENT_LEVEL = "level";
public static final String KEY_STUDENT_AGE = "age";
private List<Student> studentsList;
ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list=(ListView)findViewById(R.id.listViewStudents);
list.setOnItemClickListener(this);
getStudents();
}
//This method will execute on listitem click
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//Creating an intent
Intent intent = new Intent(this, StudentDetails.class);
//Getting the requested student from the list
Student student = studentsList.get(position);
//Adding studrnt details to intent
intent.putExtra(KEY_STUDENT_ID,student.getStudentId());
intent.putExtra(KEY_STUDENT_NAME,student.getStudentName());
intent.putExtra(KEY_STUDENT_LEVEL,student.getLevel());
intent.putExtra(KEY_STUDENT_AGE,student.getAge());
//Starting another activity to show student details
startActivity(intent);
}
private void getStudents(){
//While the app fetched data we are displaying a progress dialog
final ProgressDialog loading = ProgressDialog.show(this,"Fetching Data","Please wait...",false,false);
Retrofit adapter = new Retrofit.Builder()
.baseUrl("http://muteetechbot.esy.es/")
.addConverterFactory(GsonConverterFactory.create())
.build();
//Creating an object of our api interface
StudentsAPI api = adapter.create(StudentsAPI.class);
//Defining the method
Call<List<Student>> call = api.getStudents();
call.enqueue(new Callback<List<Student>>() {
@Override
public void onResponse(Call<List<Student>> stlist, Response<List<Student>> response) {
//Dismissing the loading progressbar
loading.dismiss();
//Storing the data in our list
studentsList = response.body();
//Calling a method to show the list
showList();
}
@Override
public void onFailure(Call<List<Student>> call, Throwable t) {
loading.dismiss();
Toast.makeText(getApplicationContext(), "erro", Toast.LENGTH_LONG).show();
}
});
}
private void showList() {
//String array to store all the Students names
String[] items = new String[studentsList.size()];
//Traversing through the whole list to get all the names
for(int i=0; i<studentsList.size(); i++){
//Storing names to string array
items[i] = studentsList.get(i).getStudentName();
}
//Creating an array adapter for list view
ArrayAdapter adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items);
//Setting adapter to listview
list.setAdapter(adapter);
}
}
سنقوم الان بشرح الكلاس والداول الموجودة فيه:-
يحتوي الكلاس على داولتين methods مهمة وهي كمايلي:-
-getStudent : وفي هذه الدالة سيتم جلب بيانات الطلاب من الانترنت وسنحصل من هذه الدالة على <List<Student وسيتم شرحها بالتفصيل لاحقا.
-showlist : في هذه الدالة سيتم تهيئة البيانات وعرضها في الـ listView.
والان نأتي إلى شرح الكلاس بالكامل:-
الاسطر 25-28:-
اربعة متغيرات نصية سوف نستخدمها كـمفتايح Keys عندما نريد إرسال بيانات كل طالب إلى StudentDetails وهي الشاشة التي ستقوم بعرض بيانات كل طالب وسيتم إرسال البيانات الطلاب بوسطة الـ Intent.
السطر29:-
وهي عبارة عن List من الكلاس Student سوف نستخدمها لتخزين بيانات الطلاب فيها.
السطر30:-
اوبجكت من نوع ListView سوف نستخدمها لعرض أسماء الطلاب.
الاسطر33-40:-
دالة onCreate نستخدمها لتهئية الـ ListView واستدعاء الدالة getStudents لعرض إسماء الطلاب.
الاسطر44-59:-
وناتي إلى شرح أهم دالة في الكلاس وهي getStudents والتي تبدأ من السطر 61 -98:-
ونأتي إلى شرح عمل الدالة بالتفصيل:-
السطر63:-
عرض progress Dialoge عندما يبدا البرنامج بجلب البيانات من json feed .
الاسطر 67-70 :-
إنشاء كائن من الكلاس Retrofit وتحديد له الرابط الاساسي (root url )للبيانات وذلك من خلال الدالة baseUrl وتمرير الرابط له muteeteachbot والغرض من إنشاء الكائن هو سنستخدمه لإرسال طلب Request وذلك بتحديد الرابط الاساسي .
onResponse(Call<T> call, Response<T> response)
ويتم استدعاء هذه الدالة عندما يتم استلام الاستجابة بنجاح من السيرفر أي اننا سنمت الكود الذي نريده وسنتعامل مع البيانات مثلا : عرضها في ListView ألخ...
onFailure(Call<T> call, Throwable t)
ويتم استدعاء هذه الدالة عندما لايتم استلام الاستجابة من السيرفر وهنا نخبر المستخدم إنه لم يتم استلام البيانات .
والان انتهينا من شرح دالة getStudents تبقى لنا شرح دالة showList ببساطة هذه الدالة تقوم بتهئية وعرض البيانات على ListView.
والان انتهينا من شرح أهم دالة في الكلاس .
الان سنتكمل شرح الدالة الأخيرة method في الكلاس وهي showlist :-
الاسطر 99-114:-
الان انتهينا من الكلاس MainActivity .
8.2-نذهب إلى ملف الكلاس StudentDetails ونقوم باضافة كود استقبال الـ Intent الذي سيرسل من MainActivity كمافي الكود ادناه:
//Initializing Views
textViewStudentId = (TextView) findViewById(R.id.textViewStudentId);
textViewStudentName = (TextView) findViewById(R.id.textViewStudentName);
textViewStudentLevel = (TextView) findViewById(R.id.textViewStudentClass);
textViewStudentAge = (TextView) findViewById(R.id.textViewStudentAge);
//Getting intent
Intent intent = getIntent();
//Displaying values by fetching from intent
textViewStudentId.setText(String.valueOf(intent.getIntExtra(Activity2.KEY_STUDENT_ID, 0)));
textViewStudentName.setText(intent.getStringExtra(Activity2.KEY_STUDENT_NAME));
textViewStudentLevel.setText(intent.getStringExtra(Activity2.KEY_STUDENT_LEVEL));
textViewStudentAge.setText(String.valueOf(intent.getIntExtra(Activity2.KEY_STUDENT_AGE,0)));
حيث يتم اضافة الكود اعلاه في دالة onCreate ويتم استقبال الـ Intent من MainActivity بواسطة دالة Method
getIntent .
Retrofit البرنامج التعليمي بمثال في Android Studio خطوة بخطوة
في Android ، يعد Retrofit عميل REST لـ Java و Android بواسطة Square inc بموجب ترخيص Apache 2.0. إنها مكتبة شبكة بسيطة تستخدم لمعاملات الشبكة. باستخدام هذه المكتبة ، يمكننا التقاط استجابة JSON بسلاسة من خدمة الويب / واجهة برمجة تطبيقات الويب. إنها مكتبة سهلة وسريعة لاسترداد البيانات وتحميلها ( JSON أو أي بيانات منظمة أخرى) عبر خدمة ويب قائمة على REST.

جدول المحتويات
- 1 الحاجة إلى Retrofit في Android:
- 2 الفرق بين Retrofit والمكتبات الأخرى:
- 3 معايير أداء لنظام Android AsyncTask و Volley و Retrofit (بالمللي ثانية ، القيمة الأقل هي الأفضل):
- 4 خطوات لدمج Retrofit 1.9 في مشروع Android Studio الخاص بنا.
- 5 مثال على Retrofit 1.9 لنوع POST في Android Studio:
- 6 Retrofit 1.9 مثال لطلب نوع GET في Android Studio:
- 7 الفرق بين Retrofit 1.9 و 2.x في نظام Android:
- 8 خطوات لدمج Retrofit 2.x في مشروع Android Studio الخاص بنا
- 9 مثال على Retrofit 2.x (نوع post) في Android Studio:
- 10 مثال على التحديث التحديثي 2.x (نوع GET) في Android Studio:
الحاجة إلى Retrofit في Android
لدينا الكثير من مكتبات الشبكة التي كانت تستخدم لجلب البيانات وإرسالها من / إلى الخادم. في مقالنا السابق ، نستخدم مكتبة Volley لمعاملات الشبكة ولكن Retrofit هو بديل نهائي لـ Volley وجميع المكتبات الأخرى. يعد Retrofit بديلاً أفضل للمكتبات الأخرى من حيث الأداء وسهولة الاستخدام والتوسعة وغيرها.
الفرق بين Retrofit والمكتبات الأخرى
في Android ، تختلف مكتبة التعديل التحديثي عن مكتبات الشبكة الأخرى لأنها تمنحنا نظامًا أساسيًا سهل الاستخدام لا نحتاج من خلاله إلى تحليل استجابات JSON كما تفعل بواسطة المكتبة نفسها. استخدمت مكتبة GSON في الخلفية لتحليل بيانات الاستجابة. ما نحتاج إلى القيام به هو تحديد POJO ( كائن جافا قديم عادي ) لتحليل الاستجابة.
معايير الأداء لنظام التشغيل Android AsyncTask و Volley و Retrofit (بالمللي ثانية ، تكون القيمة الأقل أفضل):
فيما يلي الاختلاف الرئيسي بين تقنياتنا الثلاثة المستخدمة بشكل أساسي لتنفيذ واجهات برمجة التطبيقات وهو تطبيق Android الخاص بنا. يمكنك أن ترى الفرق في الأداء الذي يعني مناقشة واحدة لطلب شبكة واحدة والاستجابة سيستغرقون مقدار الوقت.
1. AsyncTask:
مناقشة واحدة (1): 941 مللي ثانية.
سبعة (7) مناقشات: 4539 مللي ثانية.
خمسة وعشرون (25) مناقشة: 13957 مللي ثانية
2. Volley:
مناقشة واحدة (1): 560 مللي ثانية
سبعة (7) مناقشات: 2202 مللي ثانية
خمسة وعشرون (25) مناقشة: 4275 مللي ثانية
3. Retrofit:
مناقشة واحدة (1): 312 مللي ثانية
سبعة (7) مناقشات: 889 مللي ثانية
خمسة وعشرون (25) مناقشة: 1059 مللي ثانية
خطوات دمج Retrofit 1.9 في مشروع Android Studio الخاص بنا

فيما يلي الخطوات الرئيسية لدمج Retrofit في مشروعنا.
1.إضافة dependency في ملف gradle:
أولاً قم بإضافة هذه المكتبة في ملف build.gradle في وحدة التطبيق.
compile ‘com.squareup.retrofit:retrofit:1.9.0’
أضف إذن الإنترنت في AndroidManifest.xml:
بالنسبة لمعاملات الشبكة ، نحتاج إلى تحديد إذن الإنترنت في ملف Manifest الخاص بنا.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.abhiandroid.retroiftexample"> <uses-permission android:name="android.permission.INTERNET" /> <application>
3. Class POJO / Model:
لجلب الاستجابة ، نحتاج إلى إنشاء فئة POJO تقوم تلقائيًا بتحليل بيانات JSON باستخدام Gson في الخلفية. نحتاج فقط إلى إنشاء فئة POJO هذه. لإنشاء POJO class ، فإن الطريقة الأولى هي تحديد كل متغير من قبلنا وطريقة أخرى أفضل وأسرع تستخدم http://www.jsonschema2pojo.org/ platform. باستخدام هذا النظام الأساسي ، يمكنك بسهولة تحويل استجابة JSON إلى فئة POJO ، ولهذا نحتاج إلى نسخ استجابة JSON ولصقها في jsonschema2pojo وستنشئ طرق setter getter وفقًا لمتطلباتنا.
Sample POJO class:
public class SamplePojo {
private int userId;
private String name;
public int getUserId() {
return userId;
}
public String getName() {
return name;
}
}
4. أضف كلاس POJO الذي تم تنزيله في مشروعك.
5. Interface API:
نحتاج الآن إلى إنشاء واجهة لتحديد طرقنا المختلفة التي سيتم استخدامها لمعاملات الشبكة. هنا عينة من واجهة API.
public interface ApiInterface {
// For POST request
@FormUrlEncoded // annotation that used with POST type request
@POST("/demo/login.php") // specify the sub url for our base url
public void login(
@Field("user_email") String user_email,
@Field("user_pass") String user_pass, Callback<SignUpResponse> callback);
//user_email and user_pass are the post parameters and SignUpResponse is a POJO class which recieves the response of this API
// for GET request
@GET("/demo/countrylist.php") // specify the sub url for our base url
public void getVideoList(Callback<List<CountryResponse>> callback);
// CountryResponse is a POJO class which receives the response of this API
}
6. RestAdapter:
نحتاج إلى تعريف RestAdapter لتنفيذ API. لنفترض أنه يتعين علينا تنفيذ واجهة برمجة تطبيقات تسجيل الدخول ، فنحن بحاجة إلى إنشاء RestAdapter وتعيين عنوان URL الجذر وإنشاء اتصال بين المهايئ وواجهة API. لهذا ، من الأفضل إنشاء فئة لدينا فيها طريقة لإنشاء الاتصال ثم إرجاع كائن واجهة API. يمكنك إنشاء RestAdapter حيث تريد تنفيذ API ولكن من الأفضل إنشاء فئة / طريقة مشتركة واستخدامها في المكان الذي تريده.
public class Api {
public static ApiInterface getClient() {
RestAdapter adapter = new RestAdapter.Builder()
.setEndpoint("http://healthyblackmen.org") //Setting the Root URL
.build(); //Finally building the adapter
//Creating object for our interface
ApiInterface api = adapter.create(ApiInterface.class);
return api;
}
}
مثال على Retrofit 1.9 لنوع POST في Android Studio
يوجد أدناه مثال Retrofit الذي قمنا فيه بتنفيذ طلب نوع POST. في هذا نحن ننفذ تسجيل الدخول API. في هذا المثال ، نقوم أولاً بإنشاء تصميم صفحة تسجيل باستخدام 3 اسم تحرير للنص والبريد الإلكتروني وكلمة المرور وزر تسجيل واحد . بعد ذلك في MainActivity لدينا ، نحصل على EditText و Button ، وعند النقر فوق زر التسجيل ، يتم التحقق من صحة البيانات الموجودة في EditText ثم نقوم بتنفيذ واجهة برمجة تطبيقات التسجيل لحفظ البيانات في قاعدة البيانات الخاصة بنا. بعد الحصول على استجابة من api ، نعرض الرسالة على الشاشة باستخدام Toast .
يمكنك أدناه تنزيل الكود ، والاطلاع على الإخراج النهائي والشرح خطوة بخطوة للمثال:

الخطوة 1: إنشاء مشروع جديد وتسميته RetrofitExample .
الخطوة 2: افتح Gradle Scripts> build.gradle وأضف تبعية Retrofit و RecyclerView Library فيه.
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.abhiandroid.retrofitexample"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
compile 'com.squareup.retrofit:retrofit:1.9.0' // dependency for Retrofit
}
الخطوة 3: أضف إذن الإنترنت في AndroidManifest. xml :
بالنسبة لمعاملات الشبكة ، نحتاج إلى تحديد إذن الإنترنت في ملف Manifest الخاص بنا.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.abhiandroid.retrofitexample"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
الخطوة 4: افتح res -> layout -> activity_main. xml (أو) main. xml وأضف الكود التالي:
في هذه الخطوة ، نقوم بإنشاء RecyclerView في ملف 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="match_parent"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="none"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical" android:padding="20dp"> <EditText android:id="@+id/username" android:layout_width="match_parent" android:layout_height="wrap_content" android:backgroundTint="#000" android:hint="Full Name" android:imeOptions="actionNext" android:inputType="text" android:paddingBottom="15dp" android:paddingLeft="5dp" android:singleLine="true" android:textColor="#000" android:textColorHint="#000" /> <EditText android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:backgroundTint="#000" android:hint="Email Address" android:imeOptions="actionNext" android:inputType="textEmailAddress" android:paddingBottom="15dp" android:paddingLeft="5dp" android:singleLine="true" android:textColor="#000" android:textColorHint="#000" /> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:backgroundTint="#000" android:hint="Password" android:imeOptions="actionDone" android:inputType="textPassword" android:paddingBottom="15dp" android:paddingLeft="5dp" android:singleLine="true" android:textColor="#000" android:textColorHint="#000" /> <Button android:id="@+id/signUp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:backgroundTint="@color/colorPrimary" android:text="Sign Up" android:textColor="#fff" android:textSize="17sp" /> </LinearLayout> </ScrollView> </RelativeLayout>
الخطوة 5: قم بإنشاء فئة POJO جديدة SignUpResponse. java حيث لدينا طريقة setter / getter للحصول على البيانات من API.
package com.abhiandroid.retrofitexample;
import java.util.HashMap;
import java.util.Map;
public class SignUpResponse {
private String success;
private String message;
private Integer userid;
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
public String getSuccess() {
return success;
}
public void setSuccess(String success) {
this.success = success;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
الخطوة 6 : قم بإنشاء واجهة وقم بتسميتها ApiInterface.java والصق الكود التالي فيها.
في هذه الخطوة ، نقوم بإنشاء واجهة لدينا فيها طريقة طلب نشر التسجيل لإرسال البيانات باستخدام api إلى خادمنا.
package com.abhiandroid.retrofitexample;
import java.util.List;
import retrofit.Callback;
import retrofit.http.Field;
import retrofit.http.FormUrlEncoded;
import retrofit.http.POST;
public interface ApiInterface {
@FormUrlEncoded // annotation used in POST type requests
@POST("/retrofit/register.php") // API's endpoints
public void registration(@Field("name") String name,
@Field("email") String email,
@Field("password") String password,
@Field("logintype") String logintype,
Callback<SignUpResponse> callback);
// في طريقة التسجيلField المستخدم لتعيين المفاتيح ويمثل نوع البيانات String قيمة نوع السلسلة ويتم استخدام رد الاتصال للحصول على الاستجابة من api وسيتم تعيينها في فئة POJO الخاصة بنا
}
الخطوة 7: قم بإنشاء فئة Api.java جديدة والصق الكود التالي فيها.
في هذه الخطوة ، نقوم بإنشاء فئة جديدة لتعيين RestAdapter. في هذه الفئة ، تُرجع طريقة getClient كائن فئة واجهة Api الذي نستخدمه في MainActivity الخاص بنا.
package com.abhiandroid.retrofitexample;
import retrofit.RestAdapter;
public class Api {
public static ApiInterface getClient() {
// change your base URL
RestAdapter adapter = new RestAdapter.Builder()
.setEndpoint("http://mobileappdatabase.in/") //Set the Root URL
.build(); //Finally building the adapter
//Creating object for our interface
ApiInterface api = adapter.create(ApiInterface.class);
return api; // return the APIInterface object
}
}
الخطوة 8: الآن افتح التطبيق -> java -> package -> MainActivity.java وأضف الكود أدناه.
في هذه الخطوة ، نحصل أولاً على مرجع لـ EditText و Button ، وبعد ذلك نقوم بتنفيذ حدث setOnClickListener على Button وعند النقر فوق زر التسجيل يتم التحقق من صحة البيانات الموجودة في EditText ثم نقوم بتنفيذ واجهة برمجة تطبيقات التسجيل لحفظ البيانات في قاعدة البيانات الخاصة بنا. بعد الحصول على استجابة من api ، نعرض الرسالة على الشاشة باستخدام Toast .
package com.abhiandroid.retrofitexample;
import android.Manifest;
import android.app.ProgressDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.List;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
public class MainActivity extends AppCompatActivity {
SignUpResponse signUpResponsesData;
EditText email, password, name;
Button signUp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// init the EditText and Button
name = (EditText) findViewById(R.id.username);
email = (EditText) findViewById(R.id.email);
password = (EditText) findViewById(R.id.password);
signUp = (Button) findViewById(R.id.signUp);
// implement setOnClickListener event on sign up Button
signUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// validate the fields and call sign method to implement the api
if (validate(name) && validate(email) && validate(password)) {
signUp();
}
}
});
}
private boolean validate(EditText editText) {
// check the lenght of the enter data in EditText and give error if its empty
if (editText.getText().toString().trim().length() > 0) {
return true; // returs true if field is not empty
}
editText.setError("Please Fill This");
editText.requestFocus();
return false;
}
private void signUp() {
// display a progress dialog
final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setCancelable(false); // set cancelable to false
progressDialog.setMessage("Please Wait"); // set message
progressDialog.show(); // show progress dialog
// Api is a class in which we define a method getClient() that returns the API Interface class object
// registration is a POST request type method in which we are sending our field's data
Api.getClient().registration(name.getText().toString().trim(),
email.getText().toString().trim(),
password.getText().toString().trim(),
"email", new Callback<SignUpResponse>() {
@Override
public void success(SignUpResponse signUpResponse, Response response) {
// in this method we will get the response from API
progressDialog.dismiss(); //dismiss progress dialog
signUpResponsesData = signUpResponse;
// display the message getting from web api
Toast.makeText(MainActivity.this, signUpResponse.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
public void failure(RetrofitError error) {
// if error occurs in network transaction then we can get the error in this method.
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_LONG).show();
progressDialog.dismiss(); //dismiss progress dialog
}
});
}
}
مثال على Retrofit 1.9 لطلب نوع GET في Android Studio
يوجد أدناه مثال Retrofit الذي قمنا فيه بتنفيذ طلب نوع GET. في هذا نحن نعرض قائمة بالعناصر باستخدام RecyclerView . أولاً ، نعلن عن RecyclerView في ملف XML الخاص بنا ثم نحصل على مرجع له في نشاطنا. بعد ذلك ، قمنا بإنشاء فئة POJO وواجهة API ومحول Rest ثم تنفيذ API في طريقة onCreate الخاصة بنا في MainActivity. بعد الحصول على استجابة النجاح من الخادم ، نتصل بالمحول الخاص بنا لتعيين البيانات في RecyclerView.
يمكنك أدناه تنزيل الكود ، والاطلاع على الإخراج النهائي والشرح خطوة بخطوة للمثال:

الخطوة 1: إنشاء مشروع جديد وتسميته RetrofitExample .
الخطوة 2: افتح Gradle Scripts> build.gradle وأضف تبعية Retrofit و RecyclerView Library فيه.
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.abhiandroid.retrofitexample"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
compile 'com.android.support:recyclerview-v7:24.1.1' // dependency for RecyclerView
compile 'com.squareup.retrofit:retrofit:1.9.0' // dependency for Retrofit
}
الخطوة 3: إضافة إذن الإنترنت في AndroidManifest.xml:
بالنسبة لمعاملات الشبكة ، نحتاج إلى تحديد إذن الإنترنت في ملف Manifest الخاص بنا.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.abhiandroid.retrofitexample"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
الخطوة 4: افتح res -> layout -> activity_main.xml (أو) main.xml وأضف الكود التالي:
في هذه الخطوة نقوم بإنشاء RecyclerView في ملف XML الخاص بنا.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
الخطوة 5: قم بإنشاء ملف XML جديد user_list_items.xml لعنصر RecyclerView والصق الكود التالي فيه.
في هذه الخطوة ، نقوم بإنشاء ملف xml جديد لصف العناصر حيث نقوم بإنشاء ملفين TextView لإظهار البيانات.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="6dp" android:gravity="center_vertical" android:background="#f2f2f2" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <!-- create Textview's for user name and email id --> <TextView android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Name:" android:textColor="@color/colorPrimary" android:textSize="17sp" /> <TextView android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Email:" android:textColor="@color/colorPrimary" android:textSize="16sp" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="2dp" android:layout_marginBottom="2dp" android:background="@color/colorPrimary"/> </LinearLayout>
الخطوة 6: قم بإنشاء فئة POJO جديدة UserListResponse.java حيث لدينا طريقة setter / getter للحصول على البيانات من API.
package com.abhiandroid.retrofitexample;
import java.util.HashMap;
import java.util.Map;
public class UserListResponse {
// POJO class to get the data from web api
private String id;
private String name;
private String email;
private String password;
private String com_code;
private String status;
private String forgot;
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCom_code() {
return com_code;
}
public void setCom_code(String com_code) {
this.com_code = com_code;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getForgot() {
return forgot;
}
public void setForgot(String forgot) {
this.forgot = forgot;
}
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
الخطوة 7: قم بإنشاء واجهة وقم بتسميتها ApiInterface.java والصق الكود التالي فيها.
في هذه الخطوة ، نقوم بإنشاء واجهة لدينا فيها طريقة getUserList للحصول على البيانات من واجهة برمجة تطبيقات الويب.
package com.abhiandroid.retrofitexample;
import java.util.List;
import retrofit.Callback;
import retrofit.http.GET;
public interface ApiInterface {
// API's endpoints
@GET("/retrofit/getuser.php")
public void getUsersList(
Callback<List<UserListResponse>> callback);
// UserListResponse is POJO class to get the data from API, In above method we use List<UserListResponse> because the data in our API is starting from JSONArray and callback is used to get the response from api and it will set it in our POJO class
}
الخطوة 8: قم بإنشاء فئة Api.java جديدة والصق الكود التالي فيها.
في هذه الخطوة ، نقوم بإنشاء فئة جديدة لتعيين RestAdapter. في هذه الفئة ، تُرجع طريقة getClient كائن فئة واجهة Api الذي نستخدمه في MainActivity الخاص بنا.
package com.abhiandroid.retrofitexample;
import retrofit.RestAdapter;
public class Api {
public static ApiInterface getClient() {
// change your base URL
RestAdapter adapter = new RestAdapter.Builder()
.setEndpoint("http://mobileappdatabase.in/") //Set the Root URL
.build(); //Finally building the adapter
//Creating object for our interface
ApiInterface api = adapter.create(ApiInterface.class);
return api; // return the APIInterface object
}
}
الخطوة 9: الآن افتح التطبيق -> java -> package -> MainActivity.java وأضف الكود أدناه.
في هذه الخطوة أولاً نحصل على مرجع RecyclerView في نشاطنا. بعد ذلك نقوم بتنفيذ API في طريقة onCreate الخاصة بنا. أخيرًا بعد الحصول على استجابة النجاح من الخادم ، نتصل بالمحول الخاص بنا لتعيين البيانات في RecyclerView. في هذه الخطوة ، نعرض مربع حوار التقدم أثناء تنفيذ واجهة برمجة التطبيقات وبعد الحصول على استجابة أو خطأ نقوم برفضه.
package com.abhiandroid.retrofitexample;
import android.Manifest;
import android.app.ProgressDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;
import java.util.List;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
List<UserListResponse> userListResponseData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
getUserListData(); // call a method in which we have implement our GET type web API
}
private void getUserListData() {
// display a progress dialog
final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setCancelable(false); // set cancelable to false
progressDialog.setMessage("Please Wait"); // set message
progressDialog.show(); // show progress dialog
// Api is a class in which we define a method getClient() that returns the API Interface class object
// getUsersList() is a method in API Interface class, in this method we define our API sub url
Api.getClient().getUsersList(new Callback<List<UserListResponse>>() {
@Override
public void success(List<UserListResponse> userListResponses, Response response) {
// in this method we will get the response from API
progressDialog.dismiss(); //dismiss progress dialog
userListResponseData = userListResponses;
setDataInRecyclerView(); // call this method to set the data in adapter
}
@Override
public void failure(RetrofitError error) {
// if error occurs in network transaction then we can get the error in this method.
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_LONG).show();
progressDialog.dismiss(); //dismiss progress dialog
}
});
}
private void setDataInRecyclerView() {
// set a LinearLayoutManager with default vertical orientation
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
recyclerView.setLayoutManager(linearLayoutManager);
// call the constructor of UsersAdapter to send the reference and data to Adapter
UsersAdapter usersAdapter = new UsersAdapter(MainActivity.this, userListResponseData);
recyclerView.setAdapter(usersAdapter); // set the Adapter to RecyclerView
}
}
الخطوة 10: قم بإنشاء فئة جديدة UsersAdapter.java داخل الحزمة وأضف الكود التالي.
في هذه الخطوة ، نقوم بإنشاء فئة UsersAdapter ونوسع فئة RecyclerView.Adapter مع View Holder فيه. بعد ذلك نقوم بتنفيذ الطرق التي تم تجاوزها وإنشاء مُنشئ للحصول على البيانات من النشاط. في هذا المحول المخصص ، هناك طريقتان أكثر أهمية: أولاً onCreateViewHolder حيث نقوم بتضخيم عنصر التخطيط xml وتمريره إلى View Holder والآخر onBindViewHolder حيث نقوم بتعيين البيانات في طريقة العرض بمساعدة View Holder. أخيرًا ، قمنا بتنفيذ حدث setOnClickListener في عرض العناصر وعند النقر فوق العنصر ، نعرض اسم المستخدم بمساعدة Toast .
package com.abhiandroid.retrofitexample;
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 android.widget.Toast;
import java.util.List;
public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.UsersViewHolder> {
Context context;
List<UserListResponse> userListResponseData;
public UsersAdapter(Context context, List<UserListResponse> userListResponseData) {
this.userListResponseData = userListResponseData;
this.context = context;
}
@Override
public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.users_list_items, null);
UsersViewHolder usersViewHolder = new UsersViewHolder(view);
return usersViewHolder;
}
@Override
public void onBindViewHolder(UsersViewHolder holder, final int position) {
// set the data
holder.name.setText("Name: " + userListResponseData.get(position).getName());
holder.email.setText("Email: " + userListResponseData.get(position).getEmail());
// implement setONCLickListtener on itemView
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// display a toast with user name
Toast.makeText(context, userListResponseData.get(position).getName(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return userListResponseData.size(); // size of the list items
}
class UsersViewHolder extends RecyclerView.ViewHolder {
// init the item view's
TextView name, email;
public UsersViewHolder(View itemView) {
super(itemView);
// get the reference of item view's
name = (TextView) itemView.findViewById(R.id.name);
email = (TextView) itemView.findViewById(R.id.email);
}
}
}
الفرق بين Retrofit 1.9 و 2.x في نظام أندرويد
1. Dependencies Gradle - في إصدار التحديث 1.9 ، نحتاج إلى استيراد عميل HTTP ولكن في 2.x تم تحديد تبعية OKHHttp بالفعل.
2. RestAdapter and Retrofit - في Retrofit 1.9 ، نستخدم RestAdapter ولكن في 2.x نستخدم Retrofit . نمط البناء الذي يستخدم هذين النوعين لا يزال كما هو.
Retrofit 1.9
Retrofit 2.x.
Retrofit.Builder builder = new Retrofit.Builder();
3. طريقة setEndpoint و baseUrl - في Retrofit 1.9 ، تحدد طريقة setEndpoint ( url String) عنوان url الأساسي لواجهة برمجة التطبيقات ولكن في 2.x baseUrl (API_BASE_URL) تُستخدم لتعيين عنوان url الأساسي.
4. عناوين URL Dynamic - إحدى أفضل الميزات في الإصدار retrofit 2.x هي عناوين url الديناميكية. لنأخذ حالة استخدام ، نحتاج إلى تنزيل ملف من مصدر الإنترنت وسيكون للملفات عناوين url مختلفة. يتم تخزين الملفات على خادم Amazon؛ s S3 أو في مكان آخر على الويب. لذا فإن المشكلة الرئيسية في 1.9 هي أننا نحتاج إلى إنشاء RestAdapter مع عنوان url أساسي في كل مرة أردنا فيها تحميل ملف ولكن في 2.x يمكننا استخدام عناوين url الديناميكية ، لتنفيذه يمكننا ترك تعليق فعل HTTP فارغًا واستخدامurl التعليق التوضيحي كمعامل للطريقة. سيعمل Retrofit تلقائيًا على تعيين سلسلة عنوان URL المقدمة والقيام بالمهمة نيابةً عنا.
@GET public Call<File> getZipFile(@Url String url);
5. الطلبات المتزامنة وغير المتزامنة Synchronous & Asynchronous Requests - في 1.9 تتطلب الأساليب المتزامنة نوع الإرجاع. على النقيض من ذلك ، تتطلب الطريقة غير المتزامنة إعادة اتصال عامة باعتبارها معلمة الطريقة الأخيرة. في 2.x لا يوجد تمايز للطلبات المتزامنة وغير المتزامنة. يتم الآن تغليف الطلبات في فئة مكالمة عامة باستخدام نوع الاستجابة المطلوب.
6. إلغاء الطلبات Cancel Requests - في الإصدار 1.9 لم تكن هناك طريقة لإلغاء الطلبات حتى لو لم يتم تنفيذها بعد ولكن في 2.x يمكننا إلغاء الطلبات إذا لم ينفذها برنامج جدولة Http بالفعل .
7. المحول الافتراضي Default Converter - في الإصدار السابق ، يعتبر GSON مدمجًا افتراضيًا لمحول JSON ولكن في 2.x ليس لدينا أي محول افتراضي لـ JSON. نحتاج إلى تحديد تبعية محول GSON في مشروعنا. يمكننا استخدام استيراد gradle التالي لتعريف وحدة الأشقاء:
compile 'com.squareup.retrofit2:converter-gson:2.1.0’
خطوات دمج Retrofit 2.x في مشروع Android Studio الخاص بنا
فيما يلي الخطوات الرئيسية لدمج التعديل التحديثي في مشروعنا.
1. أضف dependencies التبعيات في gradle: قم أولاً بإضافة هذه المكتبات في ملف build.gradle في وحدة التطبيق.
// Retrofit compile 'com.squareup.retrofit2:retrofit:2.1.0'
// JSON Parsing compile 'com.google.code.gson:gson:2.6.1' compile 'com.squareup.retrofit2:converter-gson:2.1.0'
2. أضف إذن الإنترنت في AndroidManifest.xml: بالنسبة لمعاملات الشبكة ، نحتاج إلى تحديد إذن الإنترنت في ملف Manifest الخاص بنا.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.abhiandroid.retroiftexample"> <uses-permission android:name="android.permission.INTERNET" /> <application>
3. فئة POJO / Model: لجلب الاستجابة ، نحتاج إلى إنشاء فئة POJO تقوم تلقائيًا بتحليل بيانات JSON باستخدام Gson في الخلفية. نحتاج فقط إلى إنشاء فئة POJO هذه. لإنشاء POJO class ، فإن الطريقة الأولى هي تحديد كل متغير من قبلنا وطريقة أخرى أفضل وأسرع تستخدم http://www.jsonschema2pojo.org/ platform. باستخدام هذا النظام الأساسي ، يمكنك بسهولة تحويل استجابة JSON إلى فئة POJO ، ولهذا نحتاج إلى نسخ استجابة JSON ولصقها في jsonschema2pojo وستنشئ طرق setter getter وفقًا لمتطلباتنا.
عينة فئة POJO:
public class SamplePojo {
private int userId;
private String name;
public int getUserId() {
return userId;
}
public String getName() {
return name;
}
}
4. أضف كلاس POJO الذي تم تنزيله في مشروعك.
5. واجهة Interface API: نحتاج الآن إلى إنشاء واجهة لتحديد طرقنا المختلفة التي سيتم استخدامها لمعاملات الشبكة. هنا عينة من واجهة API.
public interface ApiInterface {
// For POST request
@FormUrlEncoded // annotation used in POST type requests
@POST("/retrofit/register.php") // API's endpoints
Call<SignUpResponse> registration(@Field("name") String name,
@Field("email") String email);//user_email and user_pass are the post parameters and SignUpResponse is a POJO class which receives the response of this API
// for GET request
@GET("/retrofit/getuser.php")
// API's endpoints
Call<List<UserListResponse>> getUsersList();
// UserListResponse is POJO class to get the data from API, we use List<UserListResponse> in callback because the data in our API is starting from JSONArray
}
6. إنشاء مثيل Retrofit : بالنسبة لطلبات الشبكة باستخدام Retrofit ، نحتاج إلى إنشاء مثيل باستخدام فئة منشئ التعديل التحديثي Retrofit ثم تكوينه باستخدام عنوان URL الأساسي. لنفترض أنه يتعين علينا تنفيذ واجهة برمجة تطبيقات تسجيل الدخول ، فنحن بحاجة إلى إنشاء مثيل التعديل التحديثي ، وتعيين عنوان URL الأساسي وإنشاء اتصال بين مثيل التعديل التحديثي وواجهة API. لهذا ، من الأفضل إنشاء فئة لدينا فيها طريقة لإنشاء الاتصال ثم إرجاع كائن واجهة API. يمكنك إنشاء مثيل التعديل التحديثي هذا حيث تريد تنفيذ واجهة برمجة التطبيقات ولكن من الأفضل إنشاء فئة / طريقة مشتركة واستخدامها في المكان الذي تريده.
public class Api {
private static Retrofit retrofit = null;
public static ApiInterface getClient() {
// change your base URL
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
//Creating object for our interface
ApiInterface api = retrofit.create(ApiInterface.class);
return api; // return the APIInterface object
}
}
مثال على Retrofit 2.x (نوع Post) في Android Studio:
فيما يلي مثال على Retrofit 2.x الذي قمنا فيه بتنفيذ طلب نوع POST. في هذا نحن ننفذ تسجيل الدخول API. في هذا المثال ، نقوم أولاً بإنشاء تصميم صفحة تسجيل باستخدام 3 اسم تحرير للنص والبريد الإلكتروني وكلمة المرور وزر تسجيل واحد. بعد ذلك في MainActivity لدينا ، نحصل على EditText و Button ، وعند النقر فوق زر التسجيل ، يتم التحقق من صحة البيانات الموجودة في EditText ثم نقوم بتنفيذ واجهة برمجة تطبيقات التسجيل لحفظ البيانات في قاعدة البيانات الخاصة بنا. بعد الحصول على استجابة من api ، نعرض الرسالة على الشاشة باستخدام Toast.
يمكنك أدناه تنزيل الكود ، والاطلاع على الإخراج النهائي والشرح خطوة بخطوة للمثال :

الخطوة 1: إنشاء مشروع جديد وتسميته RetrofitExample .
الخطوة 2: افتح Gradle Scripts> build.gradle وأضف تبعية Retrofit و RecyclerView Library فيه.
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.abhiandroid.retrofitexample"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
// dependency for Retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'
// JSON Parsing
compile 'com.google.code.gson:gson:2.6.1'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
}
الخطوة 3: إضافة إذن الإنترنت في AndroidManifest.xml:
بالنسبة لمعاملات الشبكة ، نحتاج إلى تحديد إذن الإنترنت في ملف Manifest الخاص بنا.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.abhiandroid.retrofitexample"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
الخطوة 4: افتح res -> layout -> activity_main.xml (أو) main.xml وأضف الكود التالي:
في هذه الخطوة ، نقوم بإنشاء RecyclerView في ملف 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="match_parent"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="none"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical" android:padding="20dp"> <EditText android:id="@+id/username" android:layout_width="match_parent" android:layout_height="wrap_content" android:backgroundTint="#000" android:hint="Full Name" android:imeOptions="actionNext" android:inputType="text" android:paddingBottom="15dp" android:paddingLeft="5dp" android:singleLine="true" android:textColor="#000" android:textColorHint="#000" /> <EditText android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:backgroundTint="#000" android:hint="Email Address" android:imeOptions="actionNext" android:inputType="textEmailAddress" android:paddingBottom="15dp" android:paddingLeft="5dp" android:singleLine="true" android:textColor="#000" android:textColorHint="#000" /> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:backgroundTint="#000" android:hint="Password" android:imeOptions="actionDone" android:inputType="textPassword" android:paddingBottom="15dp" android:paddingLeft="5dp" android:singleLine="true" android:textColor="#000" android:textColorHint="#000" /> <Button android:id="@+id/signUp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:backgroundTint="@color/colorPrimary" android:text="Sign Up" android:textColor="#fff" android:textSize="17sp" /> </LinearLayout> </ScrollView> </RelativeLayout>
الخطوة 5: قم بإنشاء فئة POJO جديدة SignUpResponse.java حيث لدينا طريقة setter / getter للحصول على البيانات من API.
package com.abhiandroid.retrofitexample;
public class SignUpResponse {
private String success;
private String message;
private Integer userid;
public String getSuccess() {
return success;
}
public void setSuccess(String success) {
this.success = success;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
}
الخطوة 6: قم بإنشاء واجهة وقم بتسميتها ApiInterface.java والصق الكود التالي فيها.
في هذه الخطوة ، نقوم بإنشاء واجهة لدينا فيها طريقة طلب نشر التسجيل لإرسال البيانات باستخدام api إلى خادمنا.
package com.abhiandroid.retrofitexample;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface ApiInterface {
@FormUrlEncoded // annotation used in POST type requests
@POST("/retrofit/register.php")
// API's endpoints
Call<SignUpResponse> registration(@Field("name") String name,
@Field("email") String email,
@Field("password") String password,
@Field("logintype") String logintype);
// In registration method @Field used to set the keys and String data type is representing its a string type value and callback is used to get the response from api and it will set it in our POJO class
}
الخطوة 7: قم بإنشاء فئة Api.java جديدة والصق الكود التالي فيها.
في هذه الخطوة ، نقوم بإنشاء فئة جديدة لتعيين التعديل التحديثي. في هذه الفئة ، تُرجع طريقة getClient كائن فئة واجهة Api الذي نستخدمه في MainActivity الخاص بنا.
package com.abhiandroid.retrofitexample;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class Api {
private static Retrofit retrofit = null;
public static ApiInterface getClient() {
// change your base URL
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl("https://mobileappdatabase.in/")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
//Creating object for our interface
ApiInterface api = retrofit.create(ApiInterface.class);
return api; // return the APIInterface object
}
}
الخطوة 8: الآن افتح التطبيق -> java -> package -> MainActivity.java وأضف الكود أدناه.
في هذه الخطوة ، نحصل أولاً على مرجع لـ EditText و Button ، وبعد ذلك نقوم بتنفيذ حدث setOnClickListener على Button وعند النقر فوق زر التسجيل يتم التحقق من صحة البيانات الموجودة في EditText ثم نقوم بتنفيذ واجهة برمجة تطبيقات التسجيل لحفظ البيانات في قاعدة البيانات الخاصة بنا. بعد الحصول على استجابة من api ، نعرض الرسالة على الشاشة باستخدام Toast.
package com.abhiandroid.retrofitexample;
import android.Manifest;
import android.app.ProgressDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity {
SignUpResponse signUpResponsesData;
EditText emailId, password, name;
Button signUp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// init the EditText and Button
name = (EditText) findViewById(R.id.username);
emailId = (EditText) findViewById(R.id.email);
password = (EditText) findViewById(R.id.password);
signUp = (Button) findViewById(R.id.signUp);
// implement setOnClickListener event on sign up Button
signUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// validate the fields and call sign method to implement the api
if (validate(name) && validateEmail() && validate(password)) {
signUp();
}
}
});
}
private boolean validateEmail() {
String email = emailId.getText().toString().trim();
if (email.isEmpty() || !isValidEmail(email)) {
emailId.setError("Email is not valid.");
emailId.requestFocus();
return false;
}
return true;
}
private static boolean isValidEmail(String email) {
return !TextUtils.isEmpty(email) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
private boolean validate(EditText editText) {
// check the lenght of the enter data in EditText and give error if its empty
if (editText.getText().toString().trim().length() > 0) {
return true; // returns true if field is not empty
}
editText.setError("Please Fill This");
editText.requestFocus();
return false;
}
private void signUp() {
// display a progress dialog
final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setCancelable(false); // set cancelable to false
progressDialog.setMessage("Please Wait"); // set message
progressDialog.show(); // show progress dialog
// Api is a class in which we define a method getClient() that returns the API Interface class object
// registration is a POST request type method in which we are sending our field's data
// enqueue is used for callback response and error
(Api.getClient().registration(name.getText().toString().trim(),
emailId.getText().toString().trim(),
password.getText().toString().trim(),
"email")).enqueue(new Callback<SignUpResponse>() {
@Override
public void onResponse(Call<SignUpResponse> call, Response<SignUpResponse> response) {
signUpResponsesData = response.body();
Toast.makeText(getApplicationContext(), response.body().getMessage(), Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
}
@Override
public void onFailure(Call<SignUpResponse> call, Throwable t) {
Log.d("response", t.getStackTrace().toString());
progressDialog.dismiss();
}
});
}
}
مثال على Retrofit 2.x (نوع GET) في Android Studio
فيما يلي مثال على Retrofit 2.x الذي قمنا فيه بتنفيذ طلب نوع GET. في هذا نحن نعرض قائمة بالعناصر باستخدام RecyclerView. أولاً ، نعلن عن RecyclerView في ملف XML الخاص بنا ثم نحصل على مرجع له في نشاطنا. بعد ذلك ، أنشأنا فئة POJO وواجهة API ومنشئ التعديل التحديثي ثم ننفذ واجهة برمجة التطبيقات في طريقة onCreate الخاصة بنا في MainActivity. بعد الحصول على استجابة النجاح من الخادم ، نتصل بالمحول الخاص بنا لتعيين البيانات في RecyclerView.

الخطوة 1: إنشاء مشروع جديد وتسميته RetrofitExample .
الخطوة 2: افتح Gradle Scripts> build.gradle وأضف تبعية Retrofit و RecyclerView Library فيه.
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.abhiandroid.retrofitexample"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
// dependency for Retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'
// JSON Parsing
compile 'com.google.code.gson:gson:2.6.1'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
// dependency for RecyclerView
compile 'com.android.support:recyclerview-v7:24.1.1'
}
الخطوة 3: إضافة إذن الإنترنت في AndroidManifest.xml:
بالنسبة لمعاملات الشبكة ، نحتاج إلى تحديد إذن الإنترنت في ملف Manifest الخاص بنا.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.abhiandroid.retrofitexample"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
الخطوة 4: افتح res -> layout -> activity_main.xml (أو) main.xml وأضف الكود التالي:
في هذه الخطوة ، نقوم بإنشاء RecyclerView في ملف XML الخاص بنا.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
الخطوة 5: قم بإنشاء ملف XML جديد user_list_items.xml لعنصر RecyclerView والصق الكود التالي فيه.
في هذه الخطوة ، نقوم بإنشاء ملف xml جديد لصف العناصر حيث نقوم بإنشاء ملفين TextView لإظهار البيانات.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="6dp" android:gravity="center_vertical" android:background="#f2f2f2" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <!-- create Textview's for user name and email id --> <TextView android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Name:" android:textColor="@color/colorPrimary" android:textSize="17sp" /> <TextView android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Email:" android:textColor="@color/colorPrimary" android:textSize="16sp" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="2dp" android:layout_marginBottom="2dp" android:background="@color/colorPrimary"/> </LinearLayout>
الخطوة 6: قم بإنشاء فئة POJO جديدة UserListResponse.java حيث لدينا طريقة setter / getter للحصول على البيانات من API.
package com.abhiandroid.retrofitexample;
import java.util.HashMap;
import java.util.Map;
public class UserListResponse {
// POJO class to get the data from web api
private String id;
private String name;
private String email;
private String password;
private String com_code;
private String status;
private String forgot;
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCom_code() {
return com_code;
}
public void setCom_code(String com_code) {
this.com_code = com_code;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getForgot() {
return forgot;
}
public void setForgot(String forgot) {
this.forgot = forgot;
}
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
الخطوة 7: قم بإنشاء واجهة وقم بتسميتها ApiInterface.java والصق الكود التالي فيها.
في هذه الخطوة ، نقوم بإنشاء واجهة لدينا فيها طريقة getUserList للحصول على البيانات من واجهة برمجة تطبيقات الويب.
package com.abhiandroid.retrofitexample;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
public interface ApiInterface {
@GET("/retrofit/getuser.php")
// API's endpoints
Call<List<UserListResponse>> getUsersList();
// UserListResponse is POJO class to get the data from API, we use List<UserListResponse> in callback because the data in our API is starting from JSONArray
}
الخطوة 8: قم بإنشاء فئة Api.java جديدة والصق الكود التالي فيها .
في هذه الخطوة ، نقوم بإنشاء فئة جديدة لتعيين منشئ Retrofit . في هذه الفئة ، تُرجع طريقة getClient كائن فئة واجهة Api الذي نستخدمه في MainActivity الخاص بنا.
package com.abhiandroid.retrofitexample;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by AbhiAndroid
*/
public class Api {
private static Retrofit retrofit = null;
public static ApiInterface getClient() {
// change your base URL
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl("https://mobileappdatabase.in/")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
//Creating object for our interface
ApiInterface api = retrofit.create(ApiInterface.class);
return api; // return the APIInterface object
}
}
الخطوة 9: الآن افتح التطبيق -> java -> package -> MainActivity.java وأضف الكود أدناه.
في هذه الخطوة أولاً نحصل على مرجع RecyclerView في نشاطنا. بعد ذلك نقوم بتنفيذ API في طريقة onCreate الخاصة بنا. أخيرًا بعد الحصول على استجابة النجاح من الخادم ، نتصل بالمحول الخاص بنا لتعيين البيانات في RecyclerView. في هذه الخطوة ، نعرض مربع حوار التقدم أثناء تنفيذ واجهة برمجة التطبيقات وبعد الحصول على استجابة أو خطأ نقوم برفضه.
package com.abhiandroid.retrofitexample;
import android.app.ProgressDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.Toast;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
List<UserListResponse> userListResponseData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
getUserListData(); // call a method in which we have implement our GET type web API
}
private void getUserListData() {
// display a progress dialog
final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setCancelable(false); // set cancelable to false
progressDialog.setMessage("Please Wait"); // set message
progressDialog.show(); // show progress dialog
(Api.getClient().getUsersList()).enqueue(new Callback<List<UserListResponse>>() {
@Override
public void onResponse(Call<List<UserListResponse>> call, Response<List<UserListResponse>> response) {
Log.d("responseGET", response.body().get(0).getName());
progressDialog.dismiss(); //dismiss progress dialog
userListResponseData = response.body();
setDataInRecyclerView();
}
@Override
public void onFailure(Call<List<UserListResponse>> call, Throwable t) {
// if error occurs in network transaction then we can get the error in this method.
Toast.makeText(MainActivity.this, t.toString(), Toast.LENGTH_LONG).show();
progressDialog.dismiss(); //dismiss progress dialog
}
});
}
private void setDataInRecyclerView() {
// set a LinearLayoutManager with default vertical orientation
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
recyclerView.setLayoutManager(linearLayoutManager);
// call the constructor of UsersAdapter to send the reference and data to Adapter
UsersAdapter usersAdapter = new UsersAdapter(MainActivity.this, userListResponseData);
recyclerView.setAdapter(usersAdapter); // set the Adapter to RecyclerView
}
}
الخطوة 10: قم بإنشاء فئة جديدة UsersAdapter.java داخل الحزمة وأضف الكود التالي.
في هذه الخطوة ، نقوم بإنشاء فئة UsersAdapter ونوسع فئة RecyclerView.Adapter مع View Holder فيه. بعد ذلك نقوم بتنفيذ الطرق التي تم ذكرها وإنشاء مُنشئ للحصول على البيانات من النشاط. في هذا المحول المخصص ، هناك طريقتان أكثر أهمية: أولاً onCreateViewHolder حيث نقوم بتضخيم عنصر التخطيط xml وتمريره إلى View Holder والآخر onBindViewHolder حيث نقوم بتعيين البيانات في طريقة العرض بمساعدة View Holder. أخيرًا ، قمنا بتنفيذ حدث setOnClickListener في عرض العناصر وعند النقر فوق العنصر ، نعرض اسم المستخدم بمساعدة Toast.
package com.abhiandroid.retrofitexample;
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 android.widget.Toast;
import java.util.List;
public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.UsersViewHolder> {
Context context;
List<UserListResponse> userListResponseData;
public UsersAdapter(Context context, List<UserListResponse> userListResponseData) {
this.userListResponseData = userListResponseData;
this.context = context;
}
@Override
public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.users_list_items, null);
UsersViewHolder usersViewHolder = new UsersViewHolder(view);
return usersViewHolder;
}
@Override
public void onBindViewHolder(UsersViewHolder holder, final int position) {
// set the data
holder.name.setText("Name: " + userListResponseData.get(position).getName());
holder.email.setText("Email: " + userListResponseData.get(position).getEmail());
// implement setONCLickListtener on itemView
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// display a toast with user name
Toast.makeText(context, userListResponseData.get(position).getName(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return userListResponseData.size(); // size of the list items
}
class UsersViewHolder extends RecyclerView.ViewHolder {
// init the item view's
TextView name, email;
public UsersViewHolder(View itemView) {
super(itemView);
// get the reference of item view's
name = (TextView) itemView.findViewById(R.id.name);
email = (TextView) itemView.findViewById(R.id.email);
}
}
}