From 13100d288380f36ddf37c6e428f65f6e3ffdd2b7 Mon Sep 17 00:00:00 2001 From: linenive Date: Sun, 20 Jun 2021 18:48:24 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20Card=20=EC=97=90=20Tag=20=EB=9E=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ac/konkuk/koogle/Adapter/CardAdapter.kt | 105 +++++++++++++++++- .../kr/ac/konkuk/koogle/Adapter/TagAdapter.kt | 3 +- .../ac/konkuk/koogle/Fragment/CardFragment.kt | 4 +- .../kr/ac/konkuk/koogle/Model/CardModel.kt | 9 +- app/src/main/res/layout/item_card.xml | 7 ++ 5 files changed, 122 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Adapter/CardAdapter.kt b/app/src/main/java/kr/ac/konkuk/koogle/Adapter/CardAdapter.kt index 79e8438..4e97165 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Adapter/CardAdapter.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Adapter/CardAdapter.kt @@ -1,18 +1,32 @@ package kr.ac.konkuk.koogle.Adapter +import android.content.Context import android.graphics.Color +import android.text.Editable +import android.text.TextWatcher +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.EditText +import android.widget.LinearLayout +import android.widget.ScrollView +import android.widget.TextView +import androidx.core.view.children +import androidx.core.view.setMargins import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide +import kr.ac.konkuk.koogle.DBKeys import kr.ac.konkuk.koogle.Model.ArticleModel import kr.ac.konkuk.koogle.Model.CardModel +import kr.ac.konkuk.koogle.Model.TagModel +import kr.ac.konkuk.koogle.R import kr.ac.konkuk.koogle.databinding.ItemCardBinding -class CardAdapter: ListAdapter(diffUtil){ +// 2021-06-20 주예진 수정: context 추가(tag TextView를 동적으로 추가시켜주기 위해 사용) +class CardAdapter(val context: Context?): ListAdapter(diffUtil){ //리스너 정의 interface OnItemClickListener { @@ -27,6 +41,7 @@ class CardAdapter: ListAdapter(diffUtil){ var itemClickListener: OnItemClickListener? = null inner class ViewHolder(private val binding: ItemCardBinding): RecyclerView.ViewHolder(binding.root) { + var tagView: LinearLayout = itemView.findViewById(R.id.tagView) fun bind(cardModel: CardModel){ binding.nicknameTextView.text = cardModel.writerName binding.titleTextView.text = cardModel.articleTitle @@ -35,6 +50,20 @@ class CardAdapter: ListAdapter(diffUtil){ binding.currentNumberTextView.text = cardModel.currentNumber.toString() binding.locationTextView.text = cardModel.desiredLocation?.fullAddress ?: "" + // Tag List + if(cardModel.tagList!=null){ + var newTagList = arrayListOf() + + // 데이타 파싱 + for(t in cardModel.tagList!!.children){ + for(st in t.child(DBKeys.SUB_TAGS).children){ + newTagList.add(st.key.toString()) + } + } + // 뷰에 적용 + settingTagDataToView(newTagList) + } + //glide 사용 if(cardModel.writerProfileImageUrl.isNotEmpty()){ Glide.with(binding.profileImageView) @@ -74,6 +103,80 @@ class CardAdapter: ListAdapter(diffUtil){ ) } } + private fun getRow(index: Int): LinearLayout{ + return (tagView.getChildAt(index) as ScrollView).getChildAt(0) as LinearLayout + } + // 태그 row 추가 + private fun addRow() { + val row = LinearLayout(context) + val lp: LinearLayout.LayoutParams = + LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) + row.orientation = LinearLayout.HORIZONTAL + row.layoutParams = lp + + val newScrollView = ScrollView(context) + + val layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + newScrollView.layoutParams = layoutParams + + val linearParams = LinearLayout.LayoutParams( + 800, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + row.orientation = LinearLayout.HORIZONTAL + row.layoutParams = linearParams + + newScrollView.addView(row) + tagView.addView(newScrollView) + } + // 태그 리스트를 여러 줄로 분할해 동적으로 생성 + private fun settingTagDataToView(data: ArrayList){ + var lastRow: LinearLayout + for (tag in data) { + // row 가 하나도 없으면 새로 만들기 + if (tagView.childCount == 0) { + addRow() + } + // 새로운 Table row 를 추가해야 하는지 길이 검사 + lastRow = getRow(tagView.childCount - 1) + var len = 0 + val row_len = 26 + val margin = 1 + for (i in lastRow.children) { + i as TextView + len += i.text.length + margin + } + len += tag.length + if (len > row_len) { + addRow() + } + lastRow = getRow(tagView.childCount - 1) + + lastRow.addView(makeSubTagView(tag)) + } + } + // SubTag 한 칸을 생성한다. + fun makeSubTagView(tagName: String): TextView { + var subTagText = TextView(context) + subTagText.setText(tagName) + // 모서리가 둥근 태그 스타일 적용(임시) + subTagText.setTextAppearance(R.style.TAG_STYLE) + subTagText.setBackgroundResource(R.drawable.layout_tag_background) + // 태그 간 간격 설정 + val p = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) + p.setMargins(5) + subTagText.layoutParams = p + return subTagText + } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Adapter/TagAdapter.kt b/app/src/main/java/kr/ac/konkuk/koogle/Adapter/TagAdapter.kt index 8a51e8b..06ced6b 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Adapter/TagAdapter.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Adapter/TagAdapter.kt @@ -182,7 +182,6 @@ class TagAdapter(val context: Context, val data: MutableList, // 모서리가 둥근 태그 스타일 적용(임시) subTagText.setTextAppearance(R.style.TAG_STYLE) subTagText.setBackgroundResource(R.drawable.layout_tag_background) - subTagText.setBackgroundResource(R.drawable.layout_tag_background) subTagText.maxLines = 1 subTagText.ellipsize = TextUtils.TruncateAt.MARQUEE subTagText.isSingleLine = true @@ -207,7 +206,7 @@ class TagAdapter(val context: Context, val data: MutableList, if (subTagView.childCount == 0) { addRow() } - // 새로운 Table row 를 추가해야 하는지 길이 검사(임시) + // 새로운 Table row 를 추가해야 하는지 길이 검사 lastRow = getRow(subTagView.childCount - 1) var len = 0 val row_len = 26 diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Fragment/CardFragment.kt b/app/src/main/java/kr/ac/konkuk/koogle/Fragment/CardFragment.kt index a873f5d..8bf8b4d 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Fragment/CardFragment.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Fragment/CardFragment.kt @@ -18,6 +18,7 @@ import kr.ac.konkuk.koogle.Activity.ArticleActivity import kr.ac.konkuk.koogle.Adapter.CardAdapter import kr.ac.konkuk.koogle.DBKeys.Companion.ARTICLE_ID import kr.ac.konkuk.koogle.DBKeys.Companion.DB_ARTICLES +import kr.ac.konkuk.koogle.DBKeys.Companion.DB_MAIN_TAGS import kr.ac.konkuk.koogle.DBKeys.Companion.DB_USERS import kr.ac.konkuk.koogle.DBKeys.Companion.WRITER_ID import kr.ac.konkuk.koogle.Model.ArticleModel @@ -48,6 +49,7 @@ class CardFragment : Fragment(), CardStackListener { { val cardModel = snapshot.getValue(CardModel::class.java) if (cardModel != null) { + cardModel.tagList = snapshot.child(DB_MAIN_TAGS) cardList.add(cardModel) } cardAdapter.submitList(cardList) @@ -80,7 +82,7 @@ class CardFragment : Fragment(), CardStackListener { } private fun initCardStackView() { - cardAdapter = CardAdapter() + cardAdapter = CardAdapter(context) binding?.cardStackView?.layoutManager = CardStackLayoutManager(context, this) binding?.cardStackView?.adapter = cardAdapter diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Model/CardModel.kt b/app/src/main/java/kr/ac/konkuk/koogle/Model/CardModel.kt index 2603220..1e2600a 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Model/CardModel.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Model/CardModel.kt @@ -1,5 +1,6 @@ package kr.ac.konkuk.koogle.Model +import com.google.firebase.database.DataSnapshot import kr.ac.konkuk.koogle.Model.Entity.SearchResultEntity data class CardModel( @@ -13,10 +14,14 @@ data class CardModel( val articleContent:String,//글 내용 val currentNumber:Int,// 현재 모집된 인원 val recruitmentNumber:Int, //모집 인원 - val desiredLocation: SearchResultEntity? //만남 희망 장소 + val desiredLocation: SearchResultEntity?, //만남 희망 장소 + var tagList: DataSnapshot? // 태그 리스트 ){ // constructor(): this("","","", "", "", "","",0,0, null) //임시 수정 - constructor(): this("","","","", "", "","",0,0, null) + constructor(): this("","","","", "", + "","",0,0, null, + null +) } diff --git a/app/src/main/res/layout/item_card.xml b/app/src/main/res/layout/item_card.xml index 8c9e3fb..d99879e 100644 --- a/app/src/main/res/layout/item_card.xml +++ b/app/src/main/res/layout/item_card.xml @@ -159,6 +159,13 @@ android:padding="20dp" android:hint="@string/content" /> + +