From 7f9a36ae07907678b458bc69110209a4fd43ccea Mon Sep 17 00:00:00 2001 From: linenive Date: Sat, 19 Jun 2021 22:13:18 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20=ED=94=84=EB=A1=9C=ED=95=84=20=ED=83=9C?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20?= =?UTF-8?q?DB=EC=97=90=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- .../koogle/Activity/AddNewTagActivity.kt | 8 +- .../koogle/Activity/EditProfileActivity.kt | 73 +++++------------ .../konkuk/koogle/Activity/ProfileActivity.kt | 15 +++- .../koogle/Activity/ProfileCommonActivity.kt | 8 +- .../ac/konkuk/koogle/Adapter/AddTagAdapter.kt | 80 +++++++++++++------ .../kr/ac/konkuk/koogle/Adapter/TagAdapter.kt | 73 ++++++++++++----- app/src/main/res/layout/row_add_tag_value.xml | 4 +- app/src/main/res/layout/row_user_tag.xml | 5 +- app/src/main/res/layout/row_user_value.xml | 31 +++++++ 10 files changed, 187 insertions(+), 112 deletions(-) create mode 100644 app/src/main/res/layout/row_user_value.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 3b59434..44c0c42 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Activity/AddNewTagActivity.kt b/app/src/main/java/kr/ac/konkuk/koogle/Activity/AddNewTagActivity.kt index 78eccf1..31f18f7 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Activity/AddNewTagActivity.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Activity/AddNewTagActivity.kt @@ -68,12 +68,12 @@ class AddNewTagActivity:AppCompatActivity() { tagRef.orderByChild(DBKeys.USED).addListenerForSingleValueEvent(object:ValueEventListener{ override fun onDataChange(snapshot: DataSnapshot) { // 리스트 만들기 - val list: MutableList = ArrayList() + val list: MutableList = ArrayList() for (s in snapshot.children) { // 태그로 더 많이 쓰였으면 태그형으로 보여주고, 수치로 더 많이 쓰였으면 수치로 보여준다. - val used_tags = s.child(DBKeys.USED_TAGS).value.toString().toInt() - val used_value = s.child(DBKeys.USED_VALUE).value.toString().toInt() - val tagType: Int = if(used_tags >= used_value)TagType.TAG else TagType.VALUE + val usedTags = s.child(DBKeys.USED_TAGS).value.toString().toInt() + val usedValue = s.child(DBKeys.USED_VALUE).value.toString().toInt() + val tagType: Int = if(usedTags >= usedValue)TagType.TAG else TagType.VALUE // Tag 의 key 값으로 name 이 들어감 val tagModel = TagModel(s.key!!, tagType) diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Activity/EditProfileActivity.kt b/app/src/main/java/kr/ac/konkuk/koogle/Activity/EditProfileActivity.kt index a379f2e..1df5ab1 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Activity/EditProfileActivity.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Activity/EditProfileActivity.kt @@ -19,7 +19,6 @@ import com.google.firebase.database.* import com.google.firebase.database.ktx.database import com.google.firebase.ktx.Firebase import com.google.firebase.storage.FirebaseStorage -import com.google.firebase.storage.StorageReference import com.theartofdev.edmodo.cropper.CropImage import kr.ac.konkuk.koogle.Adapter.AddTagAdapter import kr.ac.konkuk.koogle.Adapter.TagAdapter @@ -48,28 +47,35 @@ class EditProfileActivity : ProfileCommonActivity() { initUserInfo() initButton() } - - // new Tag Activity 로부터 전달받은 데이타가 잘 DB에 들어가는 지 확인하기 위한 함수 - // resultData: new Tag Activity 로부터 전해받은 Data - private fun test(resultData: HashMap? = null){ - /* + + // 현재 상태를 DB에 저장 + // 기존의 데이터는 사라진다. + private fun saveTag(){ userTagRef = Firebase.database.reference .child(DBKeys.DB_USER_TAG).child(firebaseUser.uid) - // 임시: 화면에 뿌려주어야 하는데 일단은 DB에 넣도록 구현함 + var j = tagAdapter.itemCount - for((key, value) in resultData!!){ + val tags = mutableMapOf() + for(value in tagAdapter.data) { val newTag = mutableMapOf() val newSubTag = mutableMapOf() - for((i, s) in value.sub_tag_list.withIndex()){ + for ((i, s) in value.sub_tag_list.withIndex()) { newSubTag[s] = i } newTag[DBKeys.TAG_INDEX] = j newTag[DBKeys.SUB_TAGS] = newSubTag newTag[DBKeys.TAG_TYPE] = value.tag_type newTag[DBKeys.TAG_VALUE] = value.value - userTagRef.child(key).setValue(newTag) + tags[value.main_tag_name] = newTag j++ - }*/ + } + userTagRef.setValue(tags) + } + + // new Tag Activity 로부터 전달받은 데이타가 잘 DB에 들어가는 지 확인하기 위한 함수 + // resultData: new Tag Activity 로부터 전해받은 Data + private fun test(resultData: HashMap? = null){ + // 수정 방향: adapter 에 그대로 전달하기 var newList:ArrayList = arrayListOf() for((key, value) in resultData!!){ @@ -104,6 +110,7 @@ class EditProfileActivity : ProfileCommonActivity() { .start(this); } binding.profileEditButton.setOnClickListener { + saveTag() finish() } } @@ -133,46 +140,6 @@ class EditProfileActivity : ProfileCommonActivity() { Toast.makeText(this, "닉네임을 변경하였습니다", Toast.LENGTH_SHORT).show() } } - -/* - private fun initData() { - // 임시 데이터 - tag_debug_data.add(TagModel("언어", arrayListOf("한국어", "영어"), -1, 0)) - tag_debug_data.add(TagModel("성격", arrayListOf("활동적인", "솔직한"), -1, 0)) - tag_debug_data.add( - TagModel( - "취미", arrayListOf( - "영화감상", "게임", "서핑", - "여행", "독서", "술", "요리", "그림그리기" - ), -1, 0 - ) - ) - tag_debug_data.add(TagModel("전공", arrayListOf("컴퓨터", "컴퓨터공학"), -1, 0)) - tag_debug_data.add(TagModel("언어", arrayListOf("한국어", "영어"), -1, 0)) - tag_debug_data.add(TagModel("성격", arrayListOf("활동적인", "솔직한"), -1, 0)) - tag_debug_data.add( - TagModel( - "해외여행", arrayListOf( - "러시아", "태국", "중국", - "싱가폴", "미국", "캐나다", "브라질", "그린란드", "영국", "대만" - ), -1 ,0 - ) - ) - tag_debug_data.add(TagModel("전공", arrayListOf("컴퓨터", "컴퓨터공학"), -1 ,0)) - tag_debug_data.add(TagModel("언어", arrayListOf("한국어", "영어"), -1 ,0)) - tag_debug_data.add(TagModel("성격", arrayListOf("활동적인", "솔직한"), -1 ,0)) - tag_debug_data.add( - TagModel( - "취미", arrayListOf( - "영화감상", "게임", "서핑", - "여행", "독서", "술", "요리", "그림그리기" - ), -1 ,0 - ) - ) - tag_debug_data.add(TagModel("전공", arrayListOf("컴퓨터", "컴퓨터공학"), -1 ,0)) - - } -*/ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) @@ -205,7 +172,7 @@ class EditProfileActivity : ProfileCommonActivity() { } val uid = firebaseUser.uid - fileRef = FirebaseStorage.getInstance().reference.child(USER_PROFILE_IMAGE_PATH).child("$uid.jpg") + fileRef = storage.reference.child(USER_PROFILE_IMAGE_PATH).child("$uid.jpg") val uploadTask = fileRef.putFile(imageUri) @@ -243,7 +210,7 @@ class EditProfileActivity : ProfileCommonActivity() { tagAdapter = TagAdapter(this, data) tagAdapter.itemClickListener = object : TagAdapter.OnItemClickListener { override fun onItemClick( - holder: TagAdapter.ViewHolder, + holder: TagAdapter.DefaultViewHolder, view: View, data: TagModel, position: Int diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Activity/ProfileActivity.kt b/app/src/main/java/kr/ac/konkuk/koogle/Activity/ProfileActivity.kt index b005048..6634a8c 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Activity/ProfileActivity.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Activity/ProfileActivity.kt @@ -36,6 +36,7 @@ import kr.ac.konkuk.koogle.databinding.ActivityProfileBinding */ class ProfileActivity : ProfileCommonActivity() { + private val profileEditRequest = 1110 // private var tag_debug_data: ArrayList = ArrayList() lateinit var binding: ActivityProfileBinding lateinit var commentAdapter: CommentAdapter @@ -74,7 +75,7 @@ class ProfileActivity : ProfileCommonActivity() { binding.profileEditButton.setOnClickListener { val intent = Intent(this, EditProfileActivity::class.java) - startActivity(intent) + startActivityForResult(intent, profileEditRequest) } binding.backButton.setOnClickListener { @@ -125,9 +126,15 @@ class ProfileActivity : ProfileCommonActivity() { override fun onCancelled(error: DatabaseError) { } - }) + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + // 리사이클러뷰 갱신 + if(requestCode==profileEditRequest){ + initRecyclerView() + } } @@ -142,12 +149,12 @@ class ProfileActivity : ProfileCommonActivity() { override fun initTagRecyclerView(data: ArrayList) { binding.tagRecyclerView.layoutManager = LinearLayoutManager(this) // 구분선 넣기 - binding.tagRecyclerView.addItemDecoration(DividerItemDecoration(this, 1)) + //binding.tagRecyclerView.addItemDecoration(DividerItemDecoration(this, 1)) tagAdapter = TagAdapter(this, data) tagAdapter.itemClickListener = object : TagAdapter.OnItemClickListener { override fun onItemClick( - holder: TagAdapter.ViewHolder, + holder: TagAdapter.DefaultViewHolder, view: View, data: TagModel, position: Int diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Activity/ProfileCommonActivity.kt b/app/src/main/java/kr/ac/konkuk/koogle/Activity/ProfileCommonActivity.kt index 9256eb2..dc361ae 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Activity/ProfileCommonActivity.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Activity/ProfileCommonActivity.kt @@ -38,7 +38,7 @@ abstract class ProfileCommonActivity: AppCompatActivity(){ } //DB 객체 초기화 open val firebaseUser = auth.currentUser!! - private val storage = FirebaseStorage.getInstance() + open val storage = FirebaseStorage.getInstance() lateinit var userTagRef: DatabaseReference lateinit var imageUri: Uri lateinit var fileRef: StorageReference @@ -56,7 +56,7 @@ abstract class ProfileCommonActivity: AppCompatActivity(){ } // 리사이클러뷰 초기화 - private fun initRecyclerView(){ + protected fun initRecyclerView(){ // DB 에서 유저 태그 데이터 받아옴 val tagData: ArrayList = arrayListOf() userTagRef = Firebase.database.reference @@ -72,8 +72,8 @@ abstract class ProfileCommonActivity: AppCompatActivity(){ tagData.add( TagModel( s.key.toString(), newSubTag, - s.child(DBKeys.TAG_TYPE).value.toString().toInt(), - s.child(DBKeys.TAG_VALUE).value.toString().toInt() + s.child(DBKeys.TAG_VALUE).value.toString().toInt(), + s.child(DBKeys.TAG_TYPE).value.toString().toInt() )) } // 로딩 작업이 끝난 이후 RecyclerView 를 초기화하는 순서를 맞추기 위해 이곳에 넣음 diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Adapter/AddTagAdapter.kt b/app/src/main/java/kr/ac/konkuk/koogle/Adapter/AddTagAdapter.kt index 4ea3460..0ccbf84 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Adapter/AddTagAdapter.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Adapter/AddTagAdapter.kt @@ -1,9 +1,13 @@ package kr.ac.konkuk.koogle.Adapter import android.content.Context +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.TextView import androidx.core.view.children @@ -31,28 +35,9 @@ import kr.ac.konkuk.koogle.R selected */ -class AddTagAdapter(val context: Context, val data: MutableList) - :RecyclerView.Adapter(){ - var selectedList: HashMap = hashMapOf() - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - val view: View - - return when (viewType) { - TagType.TAG ->{ - view = LayoutInflater.from(context).inflate(R.layout.row_add_tag, parent, false) - DefaultViewHolder(view) - } - TagType.VALUE->{ - view = LayoutInflater.from(context).inflate(R.layout.row_add_tag_value, parent, false) - ValueViewHolder(view) - } - else -> { - view = LayoutInflater.from(context).inflate(R.layout.row_add_tag, parent, false) - DefaultViewHolder(view) - } - } - } +class AddTagAdapter(open val context: Context, open val data: MutableList) + : RecyclerView.Adapter(){ + var selectedList: HashMap = hashMapOf() // name: sub tag // selected: 해당 sub tag를 유저가 선택하였는지 여부 @@ -68,7 +53,7 @@ class AddTagAdapter(val context: Context, val data: MutableList) var subTagList: ArrayList = arrayListOf() // SubTag 한 칸을 생성한다. - private fun makeSubTagView(tagName: String): TextView{ + fun makeSubTagView(tagName: String): TextView{ var subTagText = TextView(context) subTagText.text = tagName // 모서리가 둥근 태그 스타일 적용(임시) @@ -199,8 +184,55 @@ class AddTagAdapter(val context: Context, val data: MutableList) // Tag 밑에 수치형 데이터 가 있는 형태의 row inner class ValueViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { val mainTagText: TextView = itemView.findViewById(R.id.mainTagText) + val valueText: EditText = itemView.findViewById(R.id.tagValueText) var mainTag: String = "" init { + valueText.addTextChangedListener(object: TextWatcher{ + override fun beforeTextChanged( + s: CharSequence?, + start: Int, + count: Int, + after: Int + ) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + override fun afterTextChanged(s: Editable?) { + // 선택 리스트에 추가하기 + if(valueText.length() != 0){ + // 이미 리스트에 있으면 값만 변경, 없으면 태그 모델 만들기 + if(selectedList[mainTag]!=null){ + selectedList[mainTag]!!.value = valueText.text.toString().toInt() + }else{ + selectedList[mainTag] = + TagModel(mainTag, arrayListOf(), + valueText.text.toString().toInt(), TagType.VALUE) + } + } + // 선택 리스트에서 제거하기 + else selectedList.remove(mainTag) + } + }) + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val view: View + + return when (viewType) { + TagType.TAG ->{ + view = LayoutInflater.from(context).inflate(R.layout.row_add_tag, parent, false) + DefaultViewHolder(view) + } + TagType.VALUE->{ + view = LayoutInflater.from(context).inflate(R.layout.row_add_tag_value, parent, false) + ValueViewHolder(view) + } + else -> { + view = LayoutInflater.from(context).inflate(R.layout.row_add_tag, parent, false) + DefaultViewHolder(view) + } } } @@ -209,7 +241,7 @@ class AddTagAdapter(val context: Context, val data: MutableList) if(holder is DefaultViewHolder){ holder.mainTag = tagName holder.mainTagText.text = tagName - holder.settingSubTags(tagName, 10) + holder.settingSubTags(tagName, 20) }else if(holder is ValueViewHolder){ holder.mainTag = tagName holder.mainTagText.text = tagName 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 51b23ae..983d634 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 @@ -9,19 +9,19 @@ import android.widget.* import androidx.core.view.children import androidx.core.view.setMargins import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.option_dialog.view.* import kr.ac.konkuk.koogle.R import kr.ac.konkuk.koogle.Model.TagModel +import kr.ac.konkuk.koogle.Model.TagType /* 2021-05-27 주예진 작성 프로필에서 표시되는 태그 Recycler View 의 row adapter 대분류 태그(제목)와 소분류 태그를 표시 */ -class TagAdapter(val context: Context, val data: ArrayList) : - RecyclerView.Adapter() { +class TagAdapter(open val context: Context, open val data: MutableList) + : RecyclerView.Adapter(){ interface OnItemClickListener { - fun onItemClick(holder: ViewHolder, view: View, data: TagModel, position: Int) + fun onItemClick(holder: DefaultViewHolder, view: View, data: TagModel, position: Int) } var itemClickListener: OnItemClickListener? = null @@ -34,14 +34,11 @@ class TagAdapter(val context: Context, val data: ArrayList) : // 이미 동일한 태그가 있을 때 if(tag.main_tag_name == d.main_tag_name){ index = i - - Log.d("jan", "${tag.main_tag_name} $index") break } } // 중복 태그는 subTag 만 추가하기 if(index>-1){ - Log.d("jan", index.toString()) for(s in tag.sub_tag_list){ // 서브태그도 중복 확인 후 추가하기 if(!data[index].sub_tag_list.contains(s)) @@ -51,7 +48,6 @@ class TagAdapter(val context: Context, val data: ArrayList) : } // 새로운 태그 추가하기 else{ - Log.d("jan", "new") data.add(TagModel( tag.main_tag_name, tag.sub_tag_list, tag.value, tag.tag_type )) @@ -72,9 +68,10 @@ class TagAdapter(val context: Context, val data: ArrayList) : notifyItemRemoved(pos) } - inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - private var mainTagView: TextView = itemView.findViewById(R.id.mainTagText) - private var subTagView: LinearLayout = itemView.findViewById(R.id.subTagView) + inner class DefaultViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + var mainTagText: TextView = itemView.findViewById(R.id.mainTagText) + var mainTag: String = "" + var subTagView: LinearLayout = itemView.findViewById(R.id.subTagView) init { itemView.setOnClickListener { @@ -84,9 +81,6 @@ class TagAdapter(val context: Context, val data: ArrayList) : // 소분류 태그 테이블 생성 fun bind(model: TagModel) { - // 바인드 할 때 마다 다시 생성 - subTagView.removeAllViews() - mainTagView.text = model.main_tag_name for (tag in model.sub_tag_list) { // row 가 하나도 없으면 새로 만들기 if (subTagView.childCount == 0) { @@ -146,16 +140,57 @@ class TagAdapter(val context: Context, val data: ArrayList) : } } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = LayoutInflater.from(context).inflate(R.layout.row_user_tag, parent, false) - return ViewHolder(view) + // Tag 밑에 수치형 데이터 가 있는 형태의 row + inner class ValueViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { + val mainTagText: TextView = itemView.findViewById(R.id.mainTagText) + val valueText: TextView = itemView.findViewById(R.id.tagValueText) + var mainTag: String = "" } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(data[position]) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val view:View + Log.d("jan","create") + return when(viewType){ + TagType.TAG ->{ + view = LayoutInflater.from(context).inflate(R.layout.row_user_tag, parent, false) + DefaultViewHolder(view) + } + TagType.VALUE->{ + view = LayoutInflater.from(context).inflate(R.layout.row_user_value, parent, false) + ValueViewHolder(view) + } + else -> { + view = LayoutInflater.from(context).inflate(R.layout.row_user_tag, parent, false) + DefaultViewHolder(view) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val tagName: String = data[position].main_tag_name + if(holder is DefaultViewHolder){ + holder.mainTag = tagName + holder.mainTagText.text = tagName + // 바인드 할 때 마다 다시 생성 + holder.subTagView.removeAllViews() + holder.bind(data[position]) + }else if(holder is ValueViewHolder){ + holder.mainTag = tagName + holder.mainTagText.text = tagName + holder.valueText.text = data[position].value.toString() + }else { + //(holder as SettingViewHolder) + } } override fun getItemCount(): Int { return data.size } + + // 헤더의 경우 메뉴에 포함되지 않으므로 제외 + override fun getItemViewType(position: Int): Int { + Log.d("jan","${data[position].tag_type}") + return data[position].tag_type + } + } diff --git a/app/src/main/res/layout/row_add_tag_value.xml b/app/src/main/res/layout/row_add_tag_value.xml index 65fe0ac..1228cc7 100644 --- a/app/src/main/res/layout/row_add_tag_value.xml +++ b/app/src/main/res/layout/row_add_tag_value.xml @@ -26,8 +26,10 @@ android:background="@drawable/style_round_layout_white" android:ems="10" android:gravity="center|right" + android:hint="0" android:inputType="numberDecimal" + android:maxLength="9" android:paddingRight="8dp" - android:textSize="14sp"/> + android:textSize="14sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/row_user_tag.xml b/app/src/main/res/layout/row_user_tag.xml index b798c8a..36737fa 100644 --- a/app/src/main/res/layout/row_user_tag.xml +++ b/app/src/main/res/layout/row_user_tag.xml @@ -5,14 +5,15 @@ android:background="@color/test_gray" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="10dp"> + android:paddingHorizontal="8dp" + android:paddingVertical="4dp"> diff --git a/app/src/main/res/layout/row_user_value.xml b/app/src/main/res/layout/row_user_value.xml new file mode 100644 index 0000000..1d26e16 --- /dev/null +++ b/app/src/main/res/layout/row_user_value.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file