[FAQ] 지도/로컬 API 문의 전 꼭 읽어 주세요.
https://devtalk.kakao.com/t/faq-api/125610
로그로 예외처리도 했는데 로그에는 에러메시지가 뜨는것은 없고 계속 검색결과가 없다고만 Toast메세지로 출력되어요.
class MapSearchActivity :AppCompatActivity() {
companion object {
const val BASE_URL = “https://dapi.kakao.com/”
const val API_KEY = “------” // REST API 키
}
private lateinit var binding : ActivityMapSearchBinding
private val listItems = arrayListOf<ListLayout>() // 리사이클러 뷰 아이템
private val listAdapter = ListAdapter(listItems) // 리사이클러 뷰 어댑터
private var pageNumber = 1 // 검색 페이지 번호
private var keyword = "" // 검색 키워드
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMapSearchBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
// 리사이클러 뷰
binding.rvList.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
binding.rvList.adapter = listAdapter
// 리스트 아이템 클릭 시 해당 위치로 이동
listAdapter.setItemClickListener(object: ListAdapter.OnItemClickListener {
override fun onClick(v: View, position: Int) {
val mapPoint = MapPoint.mapPointWithGeoCoord(listItems[position].y, listItems[position].x)
binding.mapView.setMapCenterPointAndZoomLevel(mapPoint, 1, true)
}
})
// 검색 버튼
binding.btnSearch.setOnClickListener {
keyword = binding.etSearchField.text.toString()
pageNumber = 1
searchKeyword(keyword, pageNumber)
}
// 이전 페이지 버튼
binding.btnPrevPage.setOnClickListener {
pageNumber--
binding.tvPageNumber.text = pageNumber.toString()
searchKeyword(keyword, pageNumber)
}
// 다음 페이지 버튼
binding.btnNextPage.setOnClickListener {
pageNumber++
binding.tvPageNumber.text = pageNumber.toString()
searchKeyword(keyword, pageNumber)
}
}
// 키워드 검색 함수
private fun searchKeyword(keyword: String, page: Int) {
try {
val retrofit = Retrofit.Builder() // Retrofit 구성
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
val api = retrofit.create(KakaoAPI::class.java) // 통신 인터페이스를 객체로 생성
val call = api.getSearchKeyword(API_KEY, keyword, page) // 검색 조건 입력
// API 서버에 요청
call.enqueue(object : Callback<ResultSearchKeyword> {
override fun onResponse(
call: Call<ResultSearchKeyword>,
response: Response<ResultSearchKeyword>
) {
// 통신 성공
addItemsAndMarkers(response.body())
}
override fun onFailure(call: Call<ResultSearchKeyword>, t: Throwable) {
// 통신 실패
Log.e("LocalSearch", "통신 실패: ${t.localizedMessage}")
}
})
} catch (e: Exception) {
Log.e("LocalSearch", "searchKeyword 함수에서 오류 발생: ${e.localizedMessage}")
}
}
// 검색 결과 처리 함수
private fun addItemsAndMarkers(searchResult: ResultSearchKeyword?) {
try{
if (!searchResult?.documents.isNullOrEmpty()) {
// 검색 결과 있음
listItems.clear() // 리스트 초기화
binding.mapView.removeAllPOIItems() // 지도의 마커 모두 제거
for (document in searchResult!!.documents) {
// 결과를 리사이클러 뷰에 추가
val item = ListLayout(document.place_name,
document.road_address_name,
document.address_name,
document.x.toDouble(),
document.y.toDouble())
listItems.add(item)
// 지도에 마커 추가
val point = MapPOIItem()
point.apply {
itemName = document.place_name
mapPoint = MapPoint.mapPointWithGeoCoord(document.y.toDouble(),
document.x.toDouble())
markerType = MapPOIItem.MarkerType.BluePin
selectedMarkerType = MapPOIItem.MarkerType.RedPin
}
binding.mapView.addPOIItem(point)
}
listAdapter.notifyDataSetChanged()
binding.btnNextPage.isEnabled = !searchResult.meta.is_end // 페이지가 더 있을 경우 다음 버튼 활성화
binding.btnPrevPage.isEnabled = pageNumber != 1 // 1페이지가 아닐 경우 이전 버튼 활성화
} else {
// 검색 결과 없음
Toast.makeText(this, "검색 결과가 없습니다", Toast.LENGTH_SHORT).show()
}
}catch (e:Exception){
Log.e("LocalSearch", "addItemsAndMarkers 함수에서 오류 발생: ${e.localizedMessage}")
}}
}