본문 바로가기

내일배움캠프

본 캠프 49일 차 - substring(),replace(),contains()

개인과제 이미지 검색앱

오늘 한 일

  • api로 받아온 시간 데이터 보기 좋게 바꾸기
  • 받아온 데이터 누르면 내 보관함으로 갈 수 있게 시도

 

받아온 시간 데이터 보기 좋게 바꾸기(yyyy-MM-dd HH:mm:ss)

위에 적은 괄호 안에 들어간 형식대로 만들어야 하는데 찾아보니 datetimefomatter를 통해 바꾸려고 시도했다.

val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
holder.date.text = dateTimeFormatter(items[position].datetime)

위 코드로 시도 했으나 그대로 받아와서 실패...

그래서 retrofit 파일에서 바꿔보는 방식이 있길래 이것도 시도해보았다.

var gson = GsonBuilder().setLenient().setDateFormat("yyyy-MM-dd HH:mm:ss").create()

private val imgRetrofit = Retrofit.Builder()
        .baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).client(
            createOkHttpClient()).build()

그래도 어림없이 반응이 없다...도대체 어떻게 해야하나...하다가 substring(0,0)으로 글자범위를 지정할 수 있는 점, 그리고 replace(a,b)로 a를 b로 바꾸는 이 두 함수를 사용해서 바꿔보리고 했다.

holder.date.text = items[position].datetime
    .substring(0,19)
    .replace("T"," ")

이제 형식에 맞게 가져오는 모습이다. 아쉬운점은 오는 데이터가 순서대로 와서 저렇게 할 수 있었던 것이지, 이 방식은 좀 아닌거 같다. 일단 해결은 되긴 했지만 찝찝한 느낌.

 

받아온 데이터 아이템을 누르면 내 보관함에 담기게 하기(실패)

SearchFragment에서 검색해 가져온 데이터 아이템들 중 클릭을 하면 그걸 activity로 넘겨서 얘를 내 보관함 프래그먼트로 넘겨주려고 구상을 했다.

우선 액티비티쪽에서 리스트를 만들어 줬다.

var myItemList : MutableList<MyItems> = mutableListOf()

이제 여기에 담을 예정이다.

담아서 들어가는 함수가 있어야 하니 

fun like(item : MyItems) {
    if (!myItemList.contains(item)) {
        myItemList.add(item)
    }
    Log.d("MainActivity","#aaa like = ${like(item)}")
}
fun unLike(item: MyItems) {
    if (myItemList.contains(item)) {
        myItemList.remove(item)
    }
}

눌러서 리스트안에 item이 있지 않으면 넣는 함수와 눌렀을 때 리스트안에 item이 있다면 지우는 함수 두개를 만들어 줬다.

원래는 밑에 add와 remove만 썼는데 만약 리스트 안에 있을 때 더 추가하거나 없을 때 삭제하는 이상한 경우를 제외 시켜야 할 거 같아서 찾아보니 contains()가 안에 존재 하는지 확인 해주는 함수라고 한다. 이제 이렇게 함수를 준비하고 fragment나 adapter에서 해야 할거 같아서 열심히 돌려보았다.

하지만...아무리 해도 이 함수를 이용할 방법도 찾지 못했다. 어쩔 수 없이 튜터님을 찾아가서 한번 여쭤보았다.

그랬더니 내가 메인에 만든 리스트가 MyItems니까 내가 로그를 따기 위해 뒀던 변수를 이용해서 함수를 이용하는 방법을 알려주셨다.

items = responseData.documents.toMutableList()
val listItem = items[0]
MyItems(listItem.display_sitename,listItem.datetime,listItem.thumbnail_url)

api를 통해 가져온 items의 리스트 0번째만 보이는 로그를 만들기 위해 만든 변수인데 이를 이용해 MyItems()로 괄호 안에 이 세 가지를 넣으면 된다고 하셨다. 그래서 찾았다는 마음에 다시 가서 만들어 본다고 하였는데...이렇게 몇번째 포지션인지 넣는게 아니라면 넣는 방법을 모르겠다...일단 그래도 onClick 되었을 때 들어가는 내용이니 어댑터의 인터페이스에서 선언한 onClick에 변수들을 선언하고 만들어보았다.(물론 이거도 오래걸린...)

var mAdapter = SearchAdapter(items)
mAdapter.itemClick = object : SearchAdapter.ItemClick {
    override fun onClick(view: View, position: Int) {
        val loc = items[position].display_sitename
        val time = items[position].datetime
        val url  = items[position].thumbnail_url
        val item = items[position]
    }
}

일단 변수까지는 선언했는데 집어 넣는게 문제다...

내 보관함에 없는걸 누르면 like 함수를 아니라면 unLike 함수를 사용해야하는데 거기에 해당하는 if문을 어떻게 작성 할지 한참을 고민했다...

우선 대충 MyItems()안에 저것들을 좀 넣어보았다.

MyItems(item.thumbnail_url,item.datetime,item.display_sitename)

이렇게 들어가면 되네?

일단 MyItems(item.thumbnail_url)과 같은게 존재하는지 찾아야하니 contains를 사용할 방법을 계속 굴려봤다.

우선 MyItems안에 존재하지 않을때 like를 넣어 추가하고 아닐경우 unLike를 사용하는 방법...

if (!item.thumbnail_url.contains(MyItems(loc,time,url).imageUrl)) {
    (mContext as MainActivity).like(MyItems(item.thumbnail_url,item.datetime,item.display_sitename))
}else{
    (mContext as MainActivity).unLike(MyItems(item.thumbnail_url,item.datetime,item.display_sitename))
}

어찌저찌 굴려보니 일단 찾은거 같다. 그래서 이제 MyItemsFragment를 어댑터와 함께 만들어 주었다.

하지만 계속 빈 화면...

결국 다시 튜터님한테 가보았다. 로그도 한번 찍어보라고 하셨고 여기서 MyItemsFragment에서 메인의 리스트를 받아오지 못해서 그런거 같다고 하셨다. 그래서 그 리스트를 가져와보라고 하셔서 이제 돌아와 만져보기 시작했는데 이걸 bundle로 보내야 할지...고민이 깊어졌다. 근데 그러기에는 버튼을 누르는게 viewpager2와 tablayout을 이용한 버튼이라 방법을 모르는게 문제...

그래서 힌트로 한 줄만 추가하면 된다고 했는데 bundle로 보내도 이는 한 줄이 넘어가기에 다른 방법을 더 찾아보았다.

그래서 생각해 낸 게 함수로 만들어서 호출해야겠다라고 생각해서 메인에다가

fun myItemList() : MutableList<MyItems> {
    return myItemList
}

이렇게 함수를 만들고

//메인 리스트 가져오기
var myList = (mContext as MainActivity).myItemList()

내보관함 프래그먼트에 이렇게 가져온 리스트를 선언 해줬는데 이걸 쓰다보니...굳이 함수로 선언 안해도 저렇게 하니 그냥 변수도 가져와지는 듯 하다. 아무튼 마무리 되었나 싶었는데

로그가 searchadapter에서 프래그먼트나 액티비티로 넘어가지 않는다...onClick부터 잘못 된거 같은데...도저히 모르겠다.

로그캣에서 에러가 났다고 표시되는게 아닌 그저 작동이 안되는 오류라 이미 튜터님들이 다 퇴근하신 뒤라 내일 얼른 튜터님한테 가서 알아보아야겠다.