سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش پارس json با کتاب خانه Retrofit با زبان کوتلین در اندروید می پردازیم آموزش های مختلفی از parse (پارس) json را برای شما قرار دادیم امروز به آموزش پارس json با کتاب خانه Retrofit به زبان کوتلین می پردازیم و سپس داده پارس شده در listView قرار می گیرد در ادامه می توانید پیش نمایشی از آن را مشاهده کنید.


در این آموزش بعد از اینکه json پارس شد در listview قرار می گیرد با کلیک بروی هر آیتم یک دیتای خاص به اکتیویتی دیگر پاس داده خواهد شد.
برای اینکه از این آموزش استفاده کنید لازم است تا کوتلین را به اندروید استودیو اضافه کنید برای اینکار می توانید از آموزش زیر استفاده کنید.
وارد فایل Build.gradle از نوع Module شده سپس در بخش Dependencies خط زیر را اضافه کنید.
compile 'com.squareup.retrofit:retrofit:1.9.0'
پروژه را sync کنید.
بعد از اینکار وارد فایل AndroidManifest.xml شده دسترسی اینترنت را همانند زیر در آن قرار دهید.
<uses-permission android:name="android.permission.INTERNET" />
یک کلاس کوتلین به نام Book.kt ایجاد کرده و کدهای زیر را در آن قرار دهید.
package ir.programchi
/**
* Created by Jefferson on 6/7/2017.
*/
class Book {
var bookId: Int = 0
var name: String? = null
var price: String? = null
var inStock: Int = 0
}
اگر یادتان باشد همیشه ما کلاس getter و setter ایجاد می کردیم دیگر اینجا نیازی نیست این کار رو بکنیم فقط کافی است مثل بالا متغیر های تعریف شده و مقدار دهی شوند در صورتی که مقدار دهی نشوند خطا خواهید داشت.
یک مثال ساده بزنم تا بهتر متوجه شوید.
اگر از کد زیر استفاده کنید.
var a: String = "abc"
a = null
خطا خواهید داشت.
اگر از کد زیر استفاده کنید.
var b: String? = "abc"
b = null
خطا نخواهید داشت پس علامت سوال ضمنی بودن تعریف متغیر را تعیین می کند یعنی متغیر در طول برنامه نیز می تواند تغییر کند.
یک کلاس دیگر به نام BooksAPI.kt ایجاد کرده و کدهای زیر را در آن قرار دهید.
package com.example.admin.retrofit2
import retrofit.Callback
import retrofit.http.GET
/**
* Created by Jefferson on 6/7/2017.
*/
interface BooksAPI {
@GET("/api/retro.php")
fun getBooks(response: Callback<List<Book>>)
}
در بالا نباید آدرس اصلی قرار گیرد.
فایل json ما در هاست , در آدرس زیر قرار دارد .
https://orjinakteb.com/api/retro.php
وارد layout خود شده در اینجا نام آن برابر با activity_main.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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:id="@+id/listViewBooks"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
در بالا یک ListView قرار گرفته است.
یک فایل به نام simple_list.xml ایجاد کرده و کدهای زیر را در آن قرار دهید.
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textStyle="bold"
android:fontFamily="cursive"
android:textSize="20sp" >
</TextView>
کد بالا شکل ظاهری هر آیتم ListView را تنظیم می کند.
حالا باید کد های مربوط به MainActivity.kt را آن قرار دهید.
package com.example.admin.retrofit2
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.app.ProgressDialog
import android.content.Intent
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.ListView
import retrofit.Callback
import retrofit.RestAdapter
import retrofit.RetrofitError
import retrofit.client.Response
class MainActivity : AppCompatActivity(){
private var listView: ListView? = null
private var books: List<Book>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
listView = findViewById(R.id.listViewBooks) as ListView
getBooks()
listView!!.setOnItemClickListener { adapterView, view, i, l ->
val intent = Intent(this, ShowBookDetails::class.java)
val book = books!![i]
intent.putExtra(KEY_BOOK_ID, book.bookId)
intent.putExtra(KEY_BOOK_NAME, book.name)
intent.putExtra(KEY_BOOK_PRICE, book.price)
intent.putExtra(KEY_BOOK_STOCK, book.inStock)
startActivity(intent)}
}
private fun getBooks() {
val loading = ProgressDialog.show(this, "Fetching Data", "Please wait...", false, false)
val adapter = RestAdapter.Builder()
.setEndpoint(ROOT_URL)
.build()
val api = adapter.create<BooksAPI>(BooksAPI::class.java!!)
api.getBooks(object : Callback<List<Book>> {
override fun success(list: List<Book>, response: Response) {
loading.dismiss()
books = list
showList()
}
override fun failure(error: RetrofitError) {
}
})
}
private fun showList() {
val items = arrayOfNulls<String>(books!!.size)
for (i in books!!.indices) {
items[i] = books!![i].name
}
val adapter = ArrayAdapter<String>(this, R.layout.simple_list, items)
listView!!.adapter = adapter
}
companion object {
val ROOT_URL = "https://orjinakteb.com/api"
val KEY_BOOK_ID = "key_book_id"
val KEY_BOOK_NAME = "key_book_name"
val KEY_BOOK_PRICE = "key_book_price"
val KEY_BOOK_STOCK = "key_book_stock"
}
}
کد بالا عمل پارس را انجام می دهد سپس برای ListView یک Listener تعریف کردیم تا با کلیک بروی هر آیتم دیتا ها از این اکتیویتی به اکتیویتی بعدی پاس داده شود در هنگام پارس json یک progressDialog نیز نمایش داده می شود.
حالا یک layout به نام activity_show_book_detail.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:id="@+id/activity_show_book_details"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textViewBookName"
android:textSize="24dp"
android:paddingTop="10dp"
android:textStyle="bold"
android:textAlignment="center"
android:fontFamily="cursive"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:textStyle="bold"
android:fontFamily="cursive"
android:id="@+id/textViewBookPrice"
android:textAlignment="center"
android:paddingTop="10dp"
android:textSize="24dp"
android:layout_below="@id/textViewBookName"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:textStyle="bold"
android:fontFamily="cursive"
android:id="@+id/textViewBookInStock"
android:textSize="24dp"
android:paddingTop="10dp"
android:textAlignment="center"
android:layout_below="@id/textViewBookPrice"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
کد بالا برای نمایش اکتیویتی دوم است و در آن یکسری TextView قرار گرفته است.
یک اکتیویتی به نام ShowBookDetail.kt ایجاد کرده و کدهای زیر را در آن قرار دهید.
package ir.programchi
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
class ShowBookDetails : AppCompatActivity() {
private var textViewBookName: TextView? = null
private var textViewBookPrice: TextView? = null
private var textViewBookInStock: TextView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_show_book_details)
textViewBookName = findViewById(R.id.textViewBookName) as TextView
textViewBookPrice = findViewById(R.id.textViewBookPrice) as TextView
textViewBookInStock = findViewById(R.id.textViewBookInStock) as TextView
val intent = intent
textViewBookName!!.text = "Title: " + intent.getStringExtra(MainActivity.KEY_BOOK_NAME)
textViewBookPrice!!.text = "Price: " + intent.getStringExtra(MainActivity.KEY_BOOK_PRICE)
textViewBookInStock!!.text = "In Stock: " + intent.getIntExtra(MainActivity.KEY_BOOK_STOCK, 0).toString()
}
}
این اکتیویتی مقدار های پاس داده شده از اکتیویتی اول را دریافت و مقادیر را در TextView نمایش می دهد.
سلام دوستان
کسی میدونه چطور میشه به یه آبجکت json عنوان داد ؟
مثل آرایه که میشه عنوان داد .مثلا می نویسیم
()response[“arrayTitle”]=array$