포켓몬 앱 실습

tpids·2024년 9월 2일

Android

목록 보기
29/29

pocker_item.xml

  • coner
  • carduse

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)

    }
}


profile
개발자

0개의 댓글