인프런 커뮤니티 질문&답변

hskim9337님의 프로필 이미지
hskim9337

작성한 질문수

[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)

badge에 관하여 질문드립니다.

작성

·

306

0

양질의 강의에 감사드립니다.
다름이 아니라 새로운 글이 올라오면 badge를 달고 싶은데
새로운 글이 올라오는지를 어떤식으로 check 할 수 있나요?
지금 생각나는 아이디어는 파이어베이스에서 posting의 size를 담아두고 있다가
게시글 작성 button이 눌리면 posting의 사이즈가 달라질테고 달라진 사이즈만큼 최신 순으로 N버튼을 달고 싶다가도
그러면 글이 작성될때마다 새로 받아야하는데 서버에 무리가 가려나 싶기도하고
아니면 단순하게 그냥 글 작성할때 뱃지를 달아놓고 일정시간?이 지나면 뱃지를 사라지게 하면 될까 싶은데 그게 가능한가요?
실제로 뱃지를 달때는 어떤식으로 로직을 짜는지 궁금합니다.

답변 4

0

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

안녕하세요 hskim님

질문이 많아지고 코드가 많아지다보니 알아보기 어려운 부분이 있네요.

깃허브에 코드 올려주시고, 궁금하신 부분 정리해서 전달주시면 좀 더 제가 대답해드리기 편할 것 같습니다~

0

hskim9337님의 프로필 이미지
hskim9337
질문자

package com.example.mytoproject.board

import android.graphics.Color
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import com.example.mytoproject.R
import com.example.mytoproject.utils.FBAuth
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import org.w3c.dom.Text
import java.text.SimpleDateFormat
import java.util.*

class BoardListLVAdapter(val boardList:MutableList<BoardModel>): BaseAdapter() {
    private val database by lazy { FirebaseDatabase.getInstance() }
    private val userRef = database.getReference("board")
    override fun getCount(): Int {
        return boardList.size
    }

    override fun getItem(p0: Int): Any {
        return boardList[p0]
    }

    override fun getItemId(p0: Int): Long {
return p0.toLong()
    }

    override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {

        var view = p1
       // if (view ==null) {

            view = LayoutInflater.from(p2?.context).inflate(R.layout.board_list_item,p2,false)


        //}

        val itemLinearLayoutview = view?.findViewById<LinearLayout>(R.id.itemview)


        val title = view?.findViewById<TextView>(R.id.titleArea)
        title!!.text = boardList[p0].title

        val content = view?.findViewById<TextView>(R.id.contentArea)
        content!!.text = boardList[p0].content

        val time = view?.findViewById<TextView>(R.id.timeArea)
        time!!.text=boardList[p0].time

        val timestamp = view?.findViewById<ImageView>(R.id.BadgeIV)




//        if(boardList[p0].uid.equals(FBAuth.getUid())) {
//            itemLinearLayoutview?.setBackgroundColor(Color.parseColor("@values/mainColor"))
//        }



            if(get_timestmap().toInt() <= 1 ) {
                    timestamp!!.visibility=View.VISIBLE
            }

            return view!!

    }

    private fun get_timestmap():Long {
        val currentTime = System.currentTimeMillis()

        val timestamps = userRef.child("timestamp").toString()

        val days = getIgnoredTimeDays(currentTime) - getIgnoredTimeDays(timestamps.toLong())

        val fewday = days / (24*60*60*1000)






        return fewday

    }
 private fun getIgnoredTimeDays(time:Long):Long {
        return Calendar.getInstance().apply {
            timeInMillis=time

            set(Calendar.HOUR_OF_DAY,0)
            set(Calendar.MINUTE,0)
            set(Calendar.SECOND,0)
            set(Calendar.MILLISECOND,0)

        }.timeInMillis
    }

얘는 BoardListAdapter.kt 입니다

0

hskim9337님의 프로필 이미지
hskim9337
질문자

하나만 더 여쭈어 보겠습니다.

 

1.최초에 글 작성 버튼을 누르면 time stamp를 저장한다.

 

 private var timestamp = System.currentTimeMillis()

binding.writeBtn.setOnClickListener {

 

 

            val title = binding.titleArea.text.toString()

            val contents = binding.contentsArea.text.toString()

            val uid = FBAuth.getUid()

            val time = FBAuth.getTime()

            val key = FBRef.boardRef.push().key.toString()

 

 

 

            FBRef.boardRef

                .child(key)

                .setValue(BoardModel(title, contents, uid, time, timestamp.toString()))

}

data class BoardModel(

 

    val title: String="",

    val content: String="",

    val uid: String="",

    val time: String="",

    val timestamp:String =""

 

    )

 

2. BoardListAdapter에서 연결한다.

 

여기서 좀 애를 먹고 있는데

이유는

데이터를 가져오는 정확한 방법을 잘 모르겠습니다.

 

private val database by lazy { FirebaseDatabase.getInstance() }

private val userRef = database.getReference("board")

val timestamps = userRef.child("timestamp").toString() < 이런식으로 가지고 오는게 맞나요?

 

파이어베이스 안에 timestamp는 잘 들어간 상태입니다

 

 

 

요런식으로요.

 

 

0

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

안녕하세요

이 부분은 여러가지 방법이 있는데 가장 쉽게 떠오르는 방법을 생각해보면

 

1. 일단 글을 등록해서 서버로 넘길 때, 글 작성 시간을 함께 넘깁니다.

2. 그리고 글을 받아오는 시간에 현재 내 시간을 체크해서 글 작성 시간과 비교합니다.

3. 글 작성 시간과 현재 시간이 1day or 특정 시간이 지나기 전에는 new라는 뱃지를 달아주시면 될 것 같습니다.

 

이런 방법으로 구현하시는 것은 어떨까요?

 

 

hskim9337님의 프로필 이미지
hskim9337
질문자

제가 확실하게 방법이 이해가 안되어서 다시 질문드립니다.

1)글 작성시 작성 button이 눌릴때 time을 받아온다.

 val time = intent.getStringExtra("time").toString()

2)특정 시간(가령 24시간)이 지날때 까지는 new라는 뱃지를 달아준다.

이렇게 잖아요

근데 new라는 뱃지가 뜨는곳은 글 목록이 있는곳이니까 거기서 imageview를 띄워야하는데 board_list_itme으로 정리를 해뒀잖아요.  그러면 여기 해당하는 kt파일이 없는데 기능적인 구현을 할 수가 있나요? 

추가적으로 24시간이 지날때까지라는 조건문을 달려면 어떤식으로 할 수 있나요?

date 자료형을 써본적이 없어서 생소한데다가 toString()으로 형변환을 한다해도 어떤식으로 표현해야 24시간동안인지 감이 잘 안잡힙니다.

 

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

우선 아래와 같은 방식으로 시도해보시겠어요?

1. timestamp를 받아온다

https://solbel.tistory.com/1468

 

2. timestamp를 글을 입력할 때 함께 firebase에 넣는다

 

3. 사용자가 접속하면 글과 함께 time정보를 가져오는데, 현재시간(사용자가 접속한 시간) 기준으로 timestamp값을 비교해서 24시간 차이를 구한다.

https://charging.tistory.com/107

 

4. board_list_itme 에 뱃지 모양을 달아놓고 invisible로 해놓고, 해당조건(24시간)을 만족하면 보여주도록 한다.

 

이런 방식으로 해보시겠어요?

hskim9337님의 프로필 이미지
hskim9337
질문자

친절한 설명 감사드립니다! 

hskim9337님의 프로필 이미지
hskim9337

작성한 질문수

질문하기