آموزش کتابخانه Gson در برنامه نویسی اندروید
سلام دوستان امیدوارم سلامت باشید در این سری از آموزش برنامه نویسی اندروید به آموزش کتابخانه Gson در برنامه نویسی اندروید می پردازیم شاید دیده باشید از کتابخانه gson در آموزش های قبلی استفاده شده است در ادامه یک نمونه ساده آن را با کتابخانه volley به کارخواهیم برد با ما همراه باشید.
در این آموزش یک وب سرویس کوچک ساختیم تا داده ها را به شکل خاصی برای ما در خروجی تحویل دهد (یک json array است).
ابتدا باید یک فایل به نام song_json.php در سرور یا xampp ایجاد کنید و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 | <?php echo json_encode(Array(Array( "song_name" => "Hero", "song_id" => "1990", "artist_name" => "Enrique"), Array("song_name" => "African Queen", "song_id" => "2004", "artist_name" => "Tuface"), Array("song_name" => "Ifunanyi", "song_id" => "2012", "artist_name" => "PSquare"))); ?> |
در بالا ما با استفاده از کد php یک json array ساختیم و نتیجه آن همانند زیر خواهد شد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [ { "song_name": "Hero", "song_id": "1990", "artist_name": "Enrique" }, { "song_name": "African Queen", "song_id": "2004", "artist_name": "Tuface" }, { "song_name": "Ifunanyi", "song_id": "2012", "artist_name": "PSquare" } ] |
بخش php به پایان رسید.
حالا باید یک پروژه اندروید بسازید بعد از اینکه ساختید فایل Build.gradle را باز کنید و کتاب خانه های زیر را اضافه کنید.
1 2 3 | compile 'com.android.support:recyclerview-v7:23.1.1' compile 'com.mcxiaoke.volley:library:1.0.19' compile 'com.google.code.gson:gson:2.6.1' |
پروژه را sync کنید.
وارد فایل AndroidManifest.xml شده و دسترسی زیر را اضافه کنید.
1 | <uses-permission android:name="android.permission.INTERNET" /> |
در فایل activity_main.xml کدهای زیر را قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?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" tools:context="ir.programchi"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:scrollbars="vertical" /> </RelativeLayout> |
یک فایل در همان پوشه به نام list_item.xml ایجاد کنید و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?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" android:padding="16dp" android:background="@color/colorBackground"> <TextView android:id="@+id/song_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:layout_marginTop="10dp" android:textSize="18dp" android:textStyle="bold" android:textColor="@color/colorPrimaryDark"/> <TextView android:id="@+id/song_year" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:textColor="#000" android:layout_below="@+id/song_title" android:layout_alignLeft="@+id/song_title" android:layout_alignStart="@+id/song_title" android:layout_marginTop="20dp" /> <TextView android:id="@+id/song_author" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:textColor="#000" android:layout_alignTop="@+id/song_year" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> </RelativeLayout> |
کد بالا آیتم های Recyclerview ما را تشکیل خواهند داد.
حالا باید یک فایل به نام ItemObject.java ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import com.google.gson.annotations.SerializedName; public class ItemObject { @SerializedName("song_name") private String songTitle; @SerializedName("song_id") private String songYear; @SerializedName("artist_name") private String songAuthor; public ItemObject(String songTitle, String songYear, String songAuthor) { this.songTitle = songTitle; this.songYear = songYear; this.songAuthor = songAuthor; } public String getSongTitle() { return songTitle; } public String getSongYear() { return songYear; } public String getSongAuthor() { return songAuthor; } } |
در بالا از annotation یا حاشیه نویسی SerializedName به منظور سریال کردن استفاده می شود اگر json را مشاهده کنید میبینید که ما key هایی به نام song_name , song_id و artist_name داریم که در بالا آن ها سریال می کنیم.
یک آداپتور ساده داریم که ورودی آن یک لیست از model که ساختیم دارد و یک context همانند زیر
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.List; public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders> { private List<ItemObject> itemList; private Context context; public RecyclerViewAdapter(Context context, List<ItemObject> itemList) { this.itemList = itemList; this.context = context; } @Override public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) { View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, null); RecyclerViewHolders rcv = new RecyclerViewHolders(layoutView); return rcv; } @Override public void onBindViewHolder(RecyclerViewHolders holder, int position) { holder.songTitle.setText("Song Title: " + itemList.get(position).getSongTitle()); holder.songYear.setText("Song Year: " + itemList.get(position).getSongYear()); holder.songAuthor.setText("Song Author: " + itemList.get(position).getSongAuthor()); } @Override public int getItemCount() { return this.itemList.size(); } } |
کد بالا در زمانی استفاده می شود که json از سمت سرور parse شده است سپس می خواهیم داده ها را در recyclerview اضافه کنیم پس باید یک لیستی از داده هایی که توسط json به درست آورده ایم درست کرده و به این اداپتور پاس بدهیم در بالا از LayoutInflater به منظور به دست آوردن view که در ابتدا ساختیم (list_item.xml) استفاده شده است (دقت کنید این بخش هر دفعه یک آیتم اضافه می کند. پس هر دفعه یک list_item در recyclerview ما new می شود)
در نهایت در بخش MainActivity.java کدهای زیر را قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class MainActivity extends AppCompatActivity { private final String TAG = "MainActivity"; private RecyclerView recyclerView; private LinearLayoutManager layoutManager; private RecyclerViewAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView)findViewById(R.id.recycler_view); layoutManager = new LinearLayoutManager(MainActivity.this); recyclerView.setLayoutManager(layoutManager); requestJsonObject(); } private void requestJsonObject(){ RequestQueue queue = Volley.newRequestQueue(this); String url ="https://programchi.ir/api/song_json.php"; StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d(TAG, "Response " + response); GsonBuilder builder = new GsonBuilder(); Gson mGson = builder.create(); List<ItemObject> posts = new ArrayList<ItemObject>(); posts = Arrays.asList(mGson.fromJson(response, ItemObject[].class)); adapter = new RecyclerViewAdapter(MainActivity.this, posts); recyclerView.setAdapter(adapter); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d(TAG, "Error " + error.getMessage()); } }); queue.add(stringRequest); } } |
ما یک void داریم به نام requestJsonObject که در آن از volley و gson استفاده شده است برای اینکه از gson استفاده کنیم ابتدا یک GsonBuilder ایجاد کردیم (یک instance ازش ساختیم) سپس یک لیست از ItemObject ایجاد کردیم و با استفاده از متود Arrays یک آرایه از مقدار دریافتی (response) ساختیم (یعنی ما مقدار دریافتی که در بالا نام آن response است را به gsonbuilder فرستادیم و بقیه کار به آن می سپاریم ! دید که اصلا پارس انجام ندادیم ) و gson خودش تشخیض میدهد که این باید به صورت jsonobject یا jsonaarray پارس شود.
این آموزش هم به پایان رسید.
موفق و پیروز باشید.
تمام RecyclerViewHolders ها ارور داره و قرمز شده.چیکارکنم ؟