238일차 - 커뮤니티 앱개발 (6) : 코틀린 게시판 기능
2021. 8. 24. 21:26ㆍDiary/201~300
오늘은 안드로이드의 뷰만 작성되어 있는 것들을, 리사이클러뷰로 변경하고 서버에서 데이터를 읽어오는대로 화면을 그리게 만들었다.
1. Board Adapter
class BoardAdapter constructor(var context:Context, var items:ArrayList<BoardItem>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
// 토큰 확인
val app_file_path = context.getExternalFilesDir(null).toString()
val token_file = File("$app_file_path/token.token")
val access_token = token_file.readText()
val conn = Connect().connect(access_token)
val board_api: BoardInterface = conn.create(BoardInterface::class.java)
lateinit var recyclerView: RecyclerView
var comment_items = arrayListOf<CommentItem>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(context)
val itemView = inflater.inflate(R.layout.fragment_board_item, parent, false)
return VH(itemView)
}
fun clear() {
items.clear()
notifyDataSetChanged()
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val vh: VH =holder as VH
val item= items[position]
vh.itemView.board_user_nickname.text = item.board_nickname
vh.itemView.board_user_title.text = item.board_title
vh.itemView.board_user_content.text = item.board_content
vh.itemView.board_like_count.text = item.board_like_count.toString()
vh.itemView.board_like_btn.setOnClickListener {
val parameter:HashMap<String, Int> = HashMap()
parameter["board_id"] = item.id
board_api.likeBoard(parameter).enqueue(object: Callback<LikeBoardData> {
override fun onResponse(call: Call<LikeBoardData>, response: Response<LikeBoardData>) {
val body = response.body()
if(body != null) {
if(body.data.username != "kwontaewan") {
vh.itemView.board_like_count.text = (vh.itemView.board_like_count.text.toString().toInt() + 1).toString()
}else {
vh.itemView.board_like_count.text = (vh.itemView.board_like_count.text.toString().toInt() - 1).toString()
}
}
Log.d("TEST", "likeBoard 통신성공 바디 -> $body")
}
override fun onFailure(call: Call<LikeBoardData>, t: Throwable) {
Log.d("TEST", "likeBoard 통신실패 에러 -> " + t.message)
}
})
}
vh.itemView.comment_more_close_btn.setOnClickListener {
vh.itemView.comment_recycler.visibility = View.GONE
vh.itemView.comment_more_btn.visibility = View.VISIBLE
vh.itemView.comment_more_close_btn.visibility = View.GONE
vh.itemView.comment_input_layout.visibility = View.GONE
}
vh.itemView.comment_more_btn.setOnClickListener {
vh.itemView.comment_recycler.visibility = View.VISIBLE
vh.itemView.comment_more_btn.visibility = View.GONE
vh.itemView.comment_more_close_btn.visibility = View.VISIBLE
vh.itemView.comment_input_layout.visibility = View.VISIBLE
val mInputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
mInputMethodManager.hideSoftInputFromWindow(vh.itemView.windowToken, 0)
board_api.getComment(item.id).enqueue(object: Callback<GetCommentData> {
override fun onResponse(call: Call<GetCommentData>, response: Response<GetCommentData>) {
val body = response.body()
if(body != null) {
comment_items.clear()
if(body.data.isNotEmpty()) {
for(nn in body.data) {
Log.d("TEST", "getComment 데이터 확인 : $nn")
comment_items.add(
CommentItem(nn.id, nn.comment_content, nn.comment_like_count.toString(), nn.comment_nickname, nn.comment_profile, nn.comment_title, nn.comment_user_type, nn.comment_username, nn.updated_at)
)
}
} else {
comment_items.add(
CommentItem(null, null, null, null, null, null, null, null, null)
)
}
recyclerView=vh.itemView.findViewById(R.id.comment_recycler) as RecyclerView
val reverse_manager = LinearLayoutManager(context)
reverse_manager.reverseLayout = true
reverse_manager.stackFromEnd = true
recyclerView.layoutManager = reverse_manager
recyclerView.adapter = CommentAdapter(context, comment_items)
}
Log.d("TEST", "getComment 통신성공 바디 -> $body")
}
override fun onFailure(call: Call<GetCommentData>, t: Throwable) {
Log.d("TEST", "getComment 통신실패 에러 -> " + t.message)
}
})
}
vh.itemView.comment_submit_btn.setOnClickListener {
val temp_comment_text = vh.itemView.comment_input.text
if(temp_comment_text.toString() != "") {
vh.itemView.comment_input.clearFocus()
vh.itemView.comment_input.setText("")
val mInputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
mInputMethodManager.hideSoftInputFromWindow(vh.itemView.windowToken, 0)
val paramter:HashMap<String, String> = HashMap()
paramter["comment_user_type"] = item.board_user_type.toString()
paramter["comment_content"] = temp_comment_text.toString()
paramter["board_id"] = item.id.toString()
board_api.createComment(paramter).enqueue(object: Callback<CreateCommentData> {
override fun onResponse(call: Call<CreateCommentData>, response: Response<CreateCommentData>) {
val body = response.body()
if(body != null) {
Log.d("TEST", "createComment 데이터확인 : ${body.data}")
comment_items.add(
CommentItem(body.data.id, body.data.comment_content, body.data.comment_like_count.toString(), body.data.comment_nickname, body.data.comment_profile, body.data.comment_title, body.data.comment_user_type, body.data.comment_username, body.data.updated_at)
)
recyclerView=vh.itemView.findViewById(R.id.comment_recycler) as RecyclerView
val reverse_manager = LinearLayoutManager(context)
reverse_manager.reverseLayout = true
reverse_manager.stackFromEnd = true
recyclerView.layoutManager = reverse_manager
recyclerView.adapter = CommentAdapter(context, comment_items)
}
Log.d("TEST", "createComment 통신성공 바디 -> $body")
}
override fun onFailure(call: Call<CreateCommentData>, t: Throwable) {
Log.d("TEST", "createComment 통신실패 에러 -> " + t.message)
}
})
}
}
}
override fun getItemCount(): Int {
return items.size
}
inner class VH constructor(itemView: View) : RecyclerView.ViewHolder(itemView){
init{
}
}
}
2. Comment Adapter
class BoardFragment : Fragment(), AdapterView.OnItemSelectedListener {
lateinit var recyclerView: RecyclerView
var items = arrayListOf<BoardItem>()
var items_no_list = arrayListOf<String>()
// 값 전달 변수
var share_access_token = ""
var share_username = ""
var share_nickname = ""
var share_profile = ""
var share_user_type = ""
var share_message = ""
companion object {
fun newInstance() : BoardFragment {
return BoardFragment()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("TEST","BoardFragment - onCreate")
}
override fun onAttach(context: Context) {
super.onAttach(context)
Log.d("TEST","BoardFragment - onAttach")
}
fun Int.dp(): Int {
val metrics = resources.displayMetrics
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), metrics).toInt()
}
@SuppressLint("ResourceType")
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
Log.d("TEST","BoardFragment - onCreateView")
val view=inflater.inflate(R.layout.fragment_board, container, false)
val select_text = view.findViewById<TextView>(R.id.select_text)
val top_select_layout = view.findViewById<LinearLayout>(R.id.top_select_layout)
val only_select_layout = view.findViewById<LinearLayout>(R.id.only_select_layout)
val top_mbit_menu_layout = view.findViewById<LinearLayout>(R.id.top_mbit_menu_layout)
val board_top_layout = view.findViewById<LinearLayout>(R.id.board_top_layout)
val board_scroll_view = view.findViewById<ScrollView>(R.id.board_scroll_view).layoutParams as ViewGroup.MarginLayoutParams
// 값 전달
val bundle = Bundle()
val bundle_arguments = arguments
share_access_token = bundle_arguments?.getString("access_token").toString()
share_username = bundle_arguments?.getString("username").toString()
share_nickname = bundle_arguments?.getString("nickname").toString()
share_profile = bundle_arguments?.getString("profile").toString()
share_user_type = bundle_arguments?.getString("user_type").toString()
share_message = bundle_arguments?.getString("share_message").toString()
Log.d("TEST", "share_access_token : $share_access_token")
Log.d("TEST", "share_username : $share_username")
Log.d("TEST", "share_nickname : $share_nickname")
Log.d("TEST", "share_profile : $share_profile")
Log.d("TEST", "share_user_type : $share_user_type")
Log.d("TEST", "share_message : $share_message")
// 최상단 MBTI 표기 변경 -> 게시판도 변경해서 불러와야할 필요가 있음.
select_text.text = share_user_type
// API 셋팅
val access_token = share_access_token
val conn = Connect().connect(access_token)
val board_api: BoardInterface = conn.create(BoardInterface::class.java)
board_api.getBoard("daily").enqueue(object: Callback<GetBoardData> {
override fun onResponse(call: Call<GetBoardData>, response: Response<GetBoardData>) {
val body = response.body()
if(body != null){
for(nn in body.data) {
Log.d("TEST", "getBoard 데이터확인 : $nn")
items.add(
BoardItem(nn.id, nn.board_content, nn.board_like_count.toString(), nn.board_nickname, nn.board_profile, nn.board_title, nn.board_type, nn.board_user_type, nn.board_username, nn.updated_at)
)
}
recyclerView=view.findViewById(R.id.board_recycler) as RecyclerView
val reverse_manager = LinearLayoutManager(requireContext())
reverse_manager.reverseLayout = true
reverse_manager.stackFromEnd = true
//
recyclerView.layoutManager = reverse_manager
recyclerView.adapter= BoardAdapter(requireContext(), items)
}
Log.d("TEST", "Board - getBoard 통신성공 바디 -> $body")
}
override fun onFailure(call: Call<GetBoardData>, t: Throwable) {
Log.d("TEST", "Board - getBoard 통신실패 에러 -> " + t.message)
}
})
val menu_istp = view.findViewById<TextView>(R.id.menu_istp)
val menu_isfp = view.findViewById<TextView>(R.id.menu_isfp)
val menu_istj = view.findViewById<TextView>(R.id.menu_istj)
val menu_isfj = view.findViewById<TextView>(R.id.menu_isfj)
val menu_intp = view.findViewById<TextView>(R.id.menu_intp)
val menu_infp = view.findViewById<TextView>(R.id.menu_infp)
val menu_intj = view.findViewById<TextView>(R.id.menu_intj)
val menu_infj = view.findViewById<TextView>(R.id.menu_infj)
val menu_estp = view.findViewById<TextView>(R.id.menu_estp)
val menu_esfp = view.findViewById<TextView>(R.id.menu_esfp)
val menu_estj = view.findViewById<TextView>(R.id.menu_estj)
val menu_esfj = view.findViewById<TextView>(R.id.menu_esfj)
val menu_entp = view.findViewById<TextView>(R.id.menu_entp)
val menu_enfp = view.findViewById<TextView>(R.id.menu_enfp)
val menu_entj = view.findViewById<TextView>(R.id.menu_entj)
val menu_enfj = view.findViewById<TextView>(R.id.menu_enfj)
fun change_option(select_item:TextView) {
only_select_layout.visibility = View.VISIBLE
top_mbit_menu_layout.visibility = View.GONE
board_top_layout.layoutParams.height = 100.dp()
board_scroll_view.setMargins(10.dp(), 60.dp(), 10.dp(), 0)
select_text.text = select_item.text
}
top_select_layout.setOnClickListener {
if(top_mbit_menu_layout.isVisible) {
only_select_layout.visibility = View.VISIBLE
top_mbit_menu_layout.visibility = View.GONE
board_top_layout.layoutParams.height = 100.dp()
board_scroll_view.setMargins(10.dp(), 60.dp(), 10.dp(), 0)
}else {
only_select_layout.visibility = View.GONE
top_mbit_menu_layout.visibility = View.VISIBLE
board_top_layout.layoutParams.height = 200.dp()
board_scroll_view.setMargins(10.dp(), 180.dp(), 10.dp(), 0)
}
}
menu_istp.setOnClickListener { change_option(menu_istp) }
menu_isfp.setOnClickListener { change_option(menu_isfp) }
menu_istj.setOnClickListener { change_option(menu_istj) }
menu_isfj.setOnClickListener { change_option(menu_isfj) }
menu_intp.setOnClickListener { change_option(menu_intp) }
menu_infp.setOnClickListener { change_option(menu_infp) }
menu_intj.setOnClickListener { change_option(menu_intj) }
menu_infj.setOnClickListener { change_option(menu_infj) }
menu_estp.setOnClickListener { change_option(menu_estp) }
menu_esfp.setOnClickListener { change_option(menu_esfp) }
menu_estj.setOnClickListener { change_option(menu_estj) }
menu_esfj.setOnClickListener { change_option(menu_esfj) }
menu_entp.setOnClickListener { change_option(menu_entp) }
menu_enfp.setOnClickListener { change_option(menu_enfp) }
menu_entj.setOnClickListener { change_option(menu_entj) }
menu_enfj.setOnClickListener { change_option(menu_enfj) }
return view
}
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
}
override fun onNothingSelected(parent: AdapterView<*>) {
// Another interface callback
}
override fun onPause() {
super.onPause()
Log.d("TEST", "BoardFragment - onPause")
}
override fun onResume() {
super.onResume()
Log.d("TEST", "BoardFragment - onResume")
}
override fun onStop() {
super.onStop()
Log.d("TEST", "BoardFragment - onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.d("TEST", "BoardFragment - onDestroy")
}
}
결과물
'Diary > 201~300' 카테고리의 다른 글
239일차 - 커뮤니티 앱개발 (7) : 코틀린 게시글 업로드 (0) | 2021.08.25 |
---|---|
커뮤니티 앱 남은 기능들 정리 (0) | 2021.08.25 |
237일차 - 커뮤니티 앱개발 (5) : 디자인 변경 (0) | 2021.08.23 |
236일차 - 커뮤니티 앱개발 (4) - 토큰(JWT), 좋아요(Like) (0) | 2021.08.22 |
235일차 - 커뮤니티 앱개발 (3) : 게시판(Board) 백엔드 개발 (0) | 2021.08.21 |