pocker_item.xml
activity_detail.xml

MainActivity.kt
package com.example.pocketmonapp
import android.os.Bundle
import android.util.Log
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import org.json.JSONObject
class MainActivity : AppCompatActivity() {
lateinit var request:StringRequest
lateinit var queue:RequestQueue
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rvPocket = findViewById<RecyclerView>(R.id.rvPocket)
queue = Volley.newRequestQueue(this)
val pocketmonList = ArrayList<PocketVO>()
val adapter = PoketAdapter(this, pocketmonList)
rvPocket.adapter = adapter
rvPocket.layoutManager = GridLayoutManager(this, 2)
for(i in 1..151){
request = StringRequest(
Request.Method.GET,
"https://pokeapi.co/api/v2/pokemon-species/$i",
{
response->
//Log.d("result", response.toString())
val jsonObject = JSONObject(response)
val name = jsonObject.getJSONArray("names").getJSONObject(2).getString("name")
Log.d("result", name)
pocketmonList.add(PocketVO(i,
"https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/$i.png", name))
adapter.notifyDataSetChanged()
},
{
error->
Log.d("result", error.toString())
}
)
queue.add(request)
}
}
}
PocketVO.kt
package com.example.pocketmonapp
data class PocketVO(val uid:Int, val imgPath:String, val name:String)
PoketAdapter.kt
package com.example.pocketmonapp
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
class PoketAdapter(val context: Context, val poketmonList:ArrayList<PocketVO>)
: RecyclerView.Adapter<PoketAdapter.ViewHolder>(){
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
val ivPocket:ImageView
val tvPocket:TextView
init {
ivPocket = itemView.findViewById(R.id.ivPocket)
tvPocket = itemView.findViewById(R.id.tvPocket)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(context)
val view = inflater.inflate(R.layout.pocker_item, parent, false)
return ViewHolder(view)
}
override fun getItemCount(): Int {
return poketmonList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
// 포켓몬 사진 => ImageView (Glide)
// load(이미지 url).into(imageView)
Glide.with(context).load(poketmonList.get(position).imgPath).into(holder.ivPocket)
// 포켓몬 이름 => TextView
holder.tvPocket.setText(poketmonList.get(position).name)
holder.itemView.setOnClickListener {
// 각 포켓몬 카드를 선택하면 해당 포켓몬의 상세정보를 보여주는 디테일 액티비티로 이동
val intent = Intent(context, DetailActivity::class.java)
//Gson(Custom VO => json 형식의 문자열 변환)
//intent.putExtra("pocket", poketmonList.get(position))\
intent.putExtra("uid", poketmonList.get(position).uid)
intent.putExtra("name", poketmonList.get(position).name)
intent.putExtra("imgPath", poketmonList.get(position).imgPath)
context.startActivity(intent)
}
}
}
DetailActivity.kt
package com.example.pocketmonapp
import android.os.Bundle
import android.util.Log
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import com.bumptech.glide.Glide
import org.json.JSONObject
class DetailActivity : AppCompatActivity() {
lateinit var request:StringRequest
lateinit var queue:RequestQueue
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_detail)
queue = Volley.newRequestQueue(this)
val ivDetailPoket = findViewById<ImageView>(R.id.ivDetailPoket)
val tvDetailPoketNm = findViewById<TextView>(R.id.tvDetailPoketNm)
val tvType1 = findViewById<TextView>(R.id.tvType1)
val tvType2 = findViewById<TextView>(R.id.tvType2)
val tvHeight = findViewById<TextView>(R.id.tvHeight)
val tvWeight = findViewById<TextView>(R.id.tvWeight)
val uid = intent.getIntExtra("uid", 0)
val name = intent.getStringExtra("name")
val imgPath = intent.getStringExtra("imgPath")
tvDetailPoketNm.text = name
Glide.with(this).load(imgPath).into(ivDetailPoket)
request = StringRequest(
Request.Method.GET,
"https://pokeapi.co/api/v2/pokemon/$uid",
{
response->
Log.d("result", response.toString())
val jsonObject = JSONObject(response)
val types = jsonObject.getJSONArray("types")
//타입 2개를 저장할 수 있는 리스트 생성
val typeList = ArrayList<String>()
for(i in 0 until types.length()){
typeList.add(types.getJSONObject(i).getJSONObject("type").getString("name"))
}
tvType1.text = typeList[0]
if(typeList.size>1){
tvType2.text = typeList[1]
}else{
tvType2.text = "None"
}
tvWeight.text = jsonObject.getDouble("weight").toString()+"kg"
tvHeight.text = jsonObject.getDouble("height").toString()+"m"
},
{
error->
Log.d("result", error.toString())
}
)
queue.add(request)
}
}