class Solution {
fun solution(keyinput: Array, board: IntArray): IntArray {
val horizontalMax = (board[0] - 1) / 2
val verticalMax = (board[1] - 1) / 2
var answer: IntArray = intArrayOf(0, 0)
keyinput.forEach {
when(it) {
"left" -> {
if(answer[0] > horizontalMax.unaryMinus()) answer[0]--
}
"right" -> {
if(answer[0] < horizontalMax.unaryPlus()) answer[0]++
}
"up" -> {
if(answer[1] < verticalMax.unaryPlus()) answer[1]++
}
"down" -> {
if(answer[1] > verticalMax.unaryMinus()) answer[1]--
}
}
}
return answer
}
companion object {
const val LEFT = "left"
const val RIGHT = "right"
const val UP = "up"
const val DOWN = "down"
}
}
class Solution {
fun solution(numbers: String) = numbers.replace("zero".toRegex(), "0")
.replace("one".toRegex(), "1")
.replace("two".toRegex(), "2")
.replace("three".toRegex(), "3")
.replace("four".toRegex(), "4")
.replace("five".toRegex(), "5")
.replace("six".toRegex(), "6")
.replace("seven".toRegex(), "7")
.replace("eight".toRegex(), "8")
.replace("nine".toRegex(), "9")
.toLong()
}
class Solution {
fun solution(lines: Array): Int {
var answer = 0
val range1 = lines[0].minOrNull()!!..lines[0].maxOrNull()!!
val range2 = lines[1].minOrNull()!!..lines[1].maxOrNull()!!
val range3 = lines[2].minOrNull()!!..lines[2].maxOrNull()!!
val intersect1 = range1.intersect(range2)
val intersect2 = range1.intersect(range3)
val intersect3 = range2.intersect(range3)
if(intersect1.size > 1) {
answer += (intersect1.maxOrNull()!! - intersect1.minOrNull()!!)
}
if(intersect2.size > 1) {
answer += (intersect2.maxOrNull()!! - intersect2.minOrNull()!!)
}
if(intersect3.size > 1) {
answer += (intersect3.maxOrNull()!! - intersect3.minOrNull()!!)
}
val intersectAll = intersect1.intersect(intersect2).intersect(intersect3)
if(intersectAll.size > 1) {
answer -= (intersectAll.maxOrNull()!! - intersectAll.minOrNull()!!) * 2
}
return answer
}
}
class Solution {
fun solution(quiz: Array): Array {
return quiz.map { s: String ->
val arr = s.trim().split(" ".toRegex())
if (arr[1] == "+" && arr[0].toInt() + arr[2].toInt() == arr[4].toInt() || arr[0].toInt() - arr[2].toInt() == arr[4].toInt()) "O" else "X"
}.toTypedArray()
}
}
class Solution {
fun solution(board: Array): Int =
board.indices.map { row ->
board[row].indices.filter { board[row][it] == 1 }.forEach { col ->
((row - 1).coerceAtLeast(0)..(row + 1).coerceAtMost(board.lastIndex)).map { row2 ->
((col - 1).coerceAtLeast(0)..(col + 1).coerceAtMost(board.first().lastIndex)).forEach { col2 ->
if (board[row2][col2] == 0)
board[row2][col2] = 2
}
}
}
}.run { board.indices.map { board[it].count { value -> value == 0 } } }.sum()
}
class Solution {
fun solution(dots: Array): Int {
var answer: Int = 0
if(getGradient(dots[0],dots[1]) == getGradient(dots[2],dots[3])) answer = 1
if(getGradient(dots[0],dots[2]) == getGradient(dots[1],dots[3])) answer = 1
if(getGradient(dots[0],dots[3]) == getGradient(dots[1],dots[2])) answer = 1
return answer
}
private fun getGradient(dotA : IntArray, dotB : IntArray) : Double {
return (dotB[1] - dotA[1]).toDouble() / (dotB[0] - dotA[0]).toDouble()
}
}
class Solution {
fun solution(strings: Array, n: Int): Array {
var answer = strings
var list = answer.sortedWith(compareBy({ it[n] }, { it }))
return list.toTypedArray()
}
}
class Solution {
fun solution(phone_number: String): String {
var answer = ""
val last = phone_number.lastIndex
for (i in 0..last - 4) answer += "*"
return answer + phone_number.slice(last - 3..last)
}
}
class Solution {
fun solution(a: Int, b: Int): Long {
var answer = 0L
if(a > b) {
for(n in b.. a) {
answer += n
}
} else {
for(n in a.. b) {
answer += n
}
}
return answer
}
}
package com.android.customitemview
import SaleItem
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Intent
import android.media.AudioAttributes
import android.media.RingtoneManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.animation.AlphaAnimation
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.NotificationCompat
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.customitemview.databinding.ActivityMainBinding
import androidx.appcompat.app.AlertDialog
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val dataList = mutableListOf<SaleItem>()
lateinit var activityResultLauncher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
dataList.add(SaleItem(R.drawable.sample1, "산지 한달된 선풍기 팝니다", "이사가서 필요가 없어졌어요 급하게 내놓습니다", "대현동", 1000, "서울 서대문구 창천동", 13, 25, false))
dataList.add(SaleItem(R.drawable.sample2, "김치냉장고", "이사로인해 내놔요", "안마담", 20000, "인천 계양구 귤현동", 8, 28, false))
dataList.add(SaleItem(R.drawable.sample3, "샤넬 카드지갑", "고퀄지갑이구요\n사용감이 있어서 싸게 내어둡니다", "코코유", 10000, "수성구 범어동", 23, 5, false))
dataList.add(SaleItem(R.drawable.sample4, "금고", "금고\n떼서 가져가야함\n대우월드마크센텀\n미국이주관계로 싸게 팝니다", "Nicole", 10000, "해운대구 우제2동", 14, 17, false))
dataList.add(SaleItem(R.drawable.sample5, "갤럭시Z플립3 팝니다", "갤럭시 Z플립3 그린 팝니다\n항시 케이스 씌워서 썻고 필름 한장챙겨드립니다\n화면에 살짝 스크래치난거 말고 크게 이상은없습니다!", "절명", 150000, "연제구 연산제8동", 22, 9, false))
dataList.add(SaleItem(R.drawable.sample6, "프라다 복조리백", "까임 오염없고 상태 깨끗합니다\n정품여부모름", "미니멀하게", 50000, "수원시 영통구 원천동", 25, 16, false))
dataList.add(SaleItem(R.drawable.sample7, "울산 동해오션뷰 60평 복층 펜트하우스 1일 숙박권 펜션 힐링 숙소 별장", "울산 동해바다뷰 60평 복층 펜트하우스 1일 숙박권\n(에어컨이 없기에 낮은 가격으로 변경했으며 8월 초 가장 더운날 다녀가신 분 경우 시원했다고 잘 지내다 가셨습니다)\n1. 인원: 6명 기준입니다. 1인 10,000원 추가요금\n2. 장소: 북구 블루마시티, 32-33층\n3. 취사도구, 침구류, 세면도구, 드라이기 2개, 선풍기 4대 구비\n4. 예약방법: 예약금 50,000원 하시면 저희는 명함을 드리며 입실 오전 잔금 입금하시면 저희는 동.호수를 알려드리며 고객님은 예약자분 신분증 앞면 주민번호 뒷자리 가리시거나 지우시고 문자로 보내주시면 저희는 카드키를 우편함에 놓아 둡니다.\n5. 33층 옥상 야외 테라스 있음, 가스버너 있음\n6. 고기 굽기 가능\n7. 입실 오후 3시, 오전 11시 퇴실, 정리, 정돈 , 밸브 잠금 부탁드립니다.\n8. 층간소음 주의 부탁드립니다.\n9. 방3개, 화장실3개, 비데 3개\n10. 저희 집안이 쓰는 별장입니다.", "굿리치", 150000, "남구 옥동", 142, 54, false))
dataList.add(SaleItem(R.drawable.sample8, "샤넬 탑핸들 가방", "샤넬 트랜디 CC 탑핸들 스몰 램스킨 블랙 금장 플랩백 !\\n + \"\\n\" + \"색상 : 블랙\\n\" + \"사이즈 : 25.5cm * 17.5cm * 8cm\\n\" + \"구성 : 본품더스트\\n\" + \"\\n\" + \"급하게 돈이 필요해서 팝니다 ㅠ ㅠ", "난쉽", 180000, "동래구 온천제2동", 31, 7, false))
dataList.add(SaleItem(R.drawable.sample9, "4행정 엔진분무기 판매합니다.", "3년전에 사서 한번 사용하고 그대로 둔 상태입니다. 요즘 사용은 안해봤습니다. 그래서 저렴하게 내 놓습니다. 중고라 반품은 어렵습니다.\n", "알뜰한", 30000, "원주시 명륜2동", 7, 28, false))
dataList.add(SaleItem(R.drawable.sample10, "셀린느 버킷 가방", "22년 신세계 대전 구매입니당\n" + "셀린느 버킷백\n" + "구매해서 몇번사용했어요\n" + "까짐 스크래치 없습니다.\n" + "타지역에서 보내는거라 택배로 진행합니당!", "똑태현", 190000, "중구 동화동", 40, 6, false))
val adapter = ItemAdapter(dataList)
binding.recyclerView.adapter = adapter
binding.recyclerView.layoutManager = LinearLayoutManager(this)
adapter.itemClick = object : ItemAdapter.ItemClick {
override fun onClick(view: View, position: Int) {
val intent = Intent(this@MainActivity, DetailActivity::class.java)
intent.putExtra(Constants.ITEM_INDEX, position);
intent.putExtra(Constants.ITEM_OBJECT, dataList[position]);
activityResultLauncher.launch(intent)
}
}
adapter.itemLongClick = object : ItemAdapter.ItemLongClick {
override fun onLongClick(view: View, position: Int) {
val ad = AlertDialog.Builder(this@MainActivity)
ad.setIcon(R.drawable.img_chat)
ad.setTitle("상품 삭제")
ad.setMessage("상품을 정말로 삭제하시겠습니까?")
ad.setPositiveButton("확인") { dialog, _ ->
dataList.removeAt(position)
adapter.notifyItemRemoved(position)
}
ad.setNegativeButton("취소") { dialog,_ ->
dialog.dismiss()
}
ad.show()
}
}
binding.ivNoti.setOnClickListener{
notification()
}
val fadeIn = AlphaAnimation(0f, 1f).apply { duration = 500 }
val fadeOut = AlphaAnimation(1f, 0f).apply { duration = 500 }
var isTop = true
binding.recyclerView.addOnScrollListener(object: RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (!binding.recyclerView.canScrollVertically(-1) // Scroll up & top
&& newState == RecyclerView.SCROLL_STATE_IDLE) {
binding.fbScrollup.startAnimation(fadeOut)
binding.fbScrollup.visibility = View.GONE
isTop = true
} else { // Scroll down....
if (isTop) {
binding.fbScrollup.visibility = View.VISIBLE
binding.fbScrollup.startAnimation(fadeIn)
isTop = false
}
}
}
})
binding.fbScrollup.setOnClickListener {
binding.recyclerView.smoothScrollToPosition(0)
}
activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == RESULT_OK) {
val itemIndex = it.data?.getIntExtra("itemIndex",0) as Int
val isLike = it.data?.getBooleanExtra("isLike",false) as Boolean
if(isLike) {
dataList[itemIndex].isLike = true
dataList[itemIndex].InterestCnt += 1
}else {
dataList[itemIndex].isLike = false
dataList[itemIndex].InterestCnt -= 1
}
adapter.notifyItemChanged(itemIndex)
}
}
}
override fun onBackPressed() {
val ad = AlertDialog.Builder(this)
ad.setIcon(R.drawable.img_chat)
ad.setTitle("종료")
ad.setMessage("정말 종료하시겠습니까?")
ad.setPositiveButton("확인") { dialog, _ ->
finish()
}
ad.setNegativeButton("취소") { dialog,_ ->
dialog.dismiss()
}
ad.show()
}
fun notification(){
val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
val builder: NotificationCompat.Builder
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
val channelId="one-channel"
val channelName="My Channel One"
val channel = NotificationChannel(
channelId,
channelName,
NotificationManager.IMPORTANCE_DEFAULT
).apply {
description = "My Channel One Description"
setShowBadge(true)
val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val audioAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build()
setSound(uri, audioAttributes)
enableVibration(true)
}
manager.createNotificationChannel(channel)
builder = NotificationCompat.Builder(this, channelId)
}else {
builder = NotificationCompat.Builder(this)
}
builder.run {
setSmallIcon(R.mipmap.ic_launcher)
setWhen(System.currentTimeMillis())
setContentTitle("키워드 알림")
setContentText("설정한 키워드에 대한 알림이 도착했습니다!!")
}
manager.notify(11, builder.build())
}
}
package com.android.customitemview
import SaleItem
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.res.ResourcesCompat
import com.android.customitemview.databinding.ActivityDetailBinding
import com.google.android.material.snackbar.Snackbar
import java.text.DecimalFormat
class DetailActivity : AppCompatActivity() {
private lateinit var binding: ActivityDetailBinding
private var isLike = false
private val item: SaleItem? by lazy {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
intent.getParcelableExtra(Constants.ITEM_OBJECT, SaleItem::class.java)
} else {
intent.getParcelableExtra<SaleItem>(Constants.ITEM_OBJECT)
}
}
private val itemPosition: Int by lazy {
intent.getIntExtra(Constants.ITEM_INDEX, 0)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityDetailBinding.inflate(layoutInflater)
setContentView(binding.root)
Log.d("jblee", "itemPosition = $itemPosition")
binding.ivItemImage.setImageDrawable(item?.let {
ResourcesCompat.getDrawable(
resources,
it.Image,
null
)
})
binding.tvSellerName.text = item?.SellerName
binding.tvSellerAddress.text = item?.Address
binding.tvITemTitle.text = item?.ItemTitle
binding.tvITemDetail.text = item?.ItemDetail
binding.tvITemDetailPrice.text = DecimalFormat("#,###").format(item?.Price) + "원"
isLike = item?.isLike == true
binding.ivDetailLike.setImageResource(if (isLike) {R.drawable.img_like2}else{R.drawable.img_like})
binding.ivBack.setOnClickListener {
exit()
}
binding.llDetailLike.setOnClickListener {
if(!isLike){
binding.ivDetailLike.setImageResource(R.drawable.img_like2)
Snackbar.make(binding.constLayout, "관심 목록에 추가되었습니다.", Snackbar.LENGTH_SHORT).show()
isLike = true
}else {
binding.ivDetailLike.setImageResource(R.drawable.img_like)
isLike = false
}
}
}
fun exit() {
val intent = Intent(this, MainActivity::class.java).apply {
putExtra("itemIndex", itemPosition)
putExtra("isLike", isLike)
}
setResult(RESULT_OK, intent)
if (!isFinishing) finish()
}
override fun onBackPressed() {
exit()
}
}
import android.os.Parcel
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import kotlinx.parcelize.Parceler
import kotlinx.parcelize.TypeParceler
@Parcelize
data class SaleItem(
val Image: Int,
val ItemTitle: String,
val ItemDetail: String,
val SellerName: String,
val Price: Int,
val Address: String,
var InterestCnt: Int,
val ChatCnt: Int,
var isLike: Boolean
) : Parcelable
package com.android.customitemview
import SaleItem
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.android.customitemview.databinding.ItemBinding
import java.text.DecimalFormat
class ItemAdapter(private val mItems: MutableList) : RecyclerView.Adapter<ItemAdapter.Holder>() {
interface ItemClick {
fun onClick(view : View, position : Int)
}
interface ItemLongClick {
fun onLongClick(view : View, position : Int)
}
var itemClick : ItemClick? = null
var itemLongClick : ItemLongClick? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
val binding = ItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return Holder(binding)
}
override fun onBindViewHolder(holder: Holder, position: Int) {
holder.itemView.setOnClickListener {
itemClick?.onClick(it, position)
}
holder.itemView.setOnLongClickListener() OnLongClickListener@{
itemLongClick?.onLongClick(it, position)
return@OnLongClickListener true
}
holder.itemImageView.setImageResource(mItems[position].Image)
holder.tvItemTitle.text = mItems[position].ItemTitle
holder.tvAddress.text = mItems[position].Address
val price = mItems[position].Price
holder.tvPrice.text = DecimalFormat("#,###").format(price)+"원"
holder.tvItemChat.text = mItems[position].ChatCnt.toString()
holder.tvItemLike.text = mItems[position].InterestCnt.toString()
if(mItems[position].isLike)
holder.ivAdapterLike.setImageResource(R.drawable.img_like2)
else
holder.ivAdapterLike.setImageResource(R.drawable.img_like)
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getItemCount(): Int {
return mItems.size
}
inner class Holder(binding: ItemBinding) : RecyclerView.ViewHolder(binding.root) {
val itemImageView = binding.iconItem
val tvItemTitle = binding.tvItemTitle
val tvAddress = binding.tvAddress
val tvPrice = binding.tvPrice
val tvItemChat = binding.tvChatCnt
val tvItemLike = binding.tvLikecnt
val ivAdapterLike = binding.ivLike
}
}
package com.android.customitemview
object Constants{
const val ITEM_INDEX = "item_index"
const val ITEM_OBJECT = "item_object"
}
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/rl_title"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center_vertical"
android:layout_marginTop="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_dongName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dongname"
android:layout_centerVertical="true"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold"
android:layout_marginStart="20dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<ImageView
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_centerVertical="true"
android:layout_marginStart="8dp"
android:src="@drawable/img_down"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@+id/tv_dongName"/>
<ImageView
android:id="@+id/iv_noti"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginEnd="16dp"
android:src="@drawable/img_bell"
android:clickable="true"
android:focusable="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/rl_title" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fb_scrollup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="20dp"
android:layout_marginBottom="20dp"
android:backgroundTint="@color/white"
android:elevation="0dp"
android:hapticFeedbackEnabled="true"
android:src="@drawable/ic_arrow_up"
app:borderWidth="0dp"
android:visibility="invisible"
app:elevation="0dp"
app:fabCustomSize="40dp"
app:fabSize="normal"
app:maxImageSize="40dp"
app:tint="@null"
tools:ignore="ContentDescription"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
>
</com.google.android.material.floatingactionbutton.FloatingActionButton>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/constLayout"
tools:context=".DetailActivity">
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/cl_btmInfo"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_itemImage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:src="@drawable/sample1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_sellerInfo"
android:layout_width="match_parent"
android:layout_height="80dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/iv_itemImage">
<ImageView
android:id="@+id/iv_face"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="16dp"
android:src="@drawable/img_face3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_sellerName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="판매자 이름"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@+id/iv_face"
app:layout_constraintTop_toTopOf="@+id/iv_face" />
<TextView
android:id="@+id/tv_sellerAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="4dp"
android:text="인천광역시 부평구"
android:textColor="#4C4B4B"
android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@+id/iv_face"
app:layout_constraintTop_toBottomOf="@+id/tv_sellerName" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:text="39.3 '("
android:textColor="#009688"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@+id/iv_face2"
app:layout_constraintEnd_toStartOf="@+id/iv_face2"
app:layout_constraintTop_toTopOf="@+id/iv_face2" />
<ImageView
android:id="@+id/iv_face2"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginEnd="16dp"
android:src="@drawable/img_face2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/tv_sellerName" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginEnd="16dp"
android:text="@string/manner_txt"
android:textColor="#9F9D9D"
android:textSize="13sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/iv_face2" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/grayLine"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/cl_sellerInfo" />
<TextView
android:id="@+id/tv_iTemTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:text="판매상품"
android:textColor="@color/black"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/cl_sellerInfo" />
<TextView
android:id="@+id/tv_iTemDetail"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="16dp"
android:text="판매상품 내용"
android:textColor="@color/black"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_iTemTitle" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
<ImageView
android:id="@+id/iv_back"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginStart="24dp"
android:layout_marginTop="24dp"
android:src="@drawable/img_back"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_btmInfo"
android:layout_width="match_parent"
android:layout_height="70dp"
android:background="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<LinearLayout
android:id="@+id/ll_detail_like"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp"
android:clickable="true"
android:focusable="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_detailLike"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/img_like"/>
</LinearLayout>
<View
android:id="@+id/view"
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:background="#E1DCDC"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/ll_detail_like"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_iTemDetailPrice"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:text="120,000원"
android:textColor="@color/black"
android:textSize="22sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/view"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="100dp"
android:layout_height="35dp"
android:layout_marginEnd="16dp"
android:background="@drawable/text_bg_round"
android:gravity="center"
android:text="@string/chat"
android:textColor="@color/white"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="140dp">
<androidx.cardview.widget.CardView
android:id="@+id/iconItemCardView"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_marginStart="16dp"
app:cardCornerRadius="8dp"
app:cardElevation="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iconItem"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/sample1" />
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/tv_itemTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="24dp"
android:ellipsize="end"
android:maxLines="2"
android:text="테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트테스트"
android:textColor="@color/black"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/iconItemCardView"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_address"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="24dp"
android:text="경기도 부천시 오정구"
android:textColor="@color/txt_sub"
android:textSize="14sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/iconItemCardView"
app:layout_constraintTop_toBottomOf="@+id/tv_itemTitle" />
<TextView
android:id="@+id/tv_price"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="24dp"
android:text="10,000원"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/iconItemCardView"
app:layout_constraintTop_toBottomOf="@+id/tv_address" />
<LinearLayout
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_marginBottom="10dp"
android:gravity="center"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:scaleType="fitXY"
android:src="@drawable/img_chat" />
<TextView
android:id="@+id/tv_chatCnt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:text="32"
android:textColor="@color/txt_sub"
android:textSize="15sp" />
<ImageView
android:id="@+id/iv_like"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginStart="8dp"
android:scaleType="fitXY"
android:src="@drawable/img_like" />
<TextView
android:id="@+id/tv_likecnt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:text="24"
android:textColor="@color/txt_sub"
android:textSize="15sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/grayLine"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
android {
namespace = "com.android.customitemview"
compileSdk = 33
defaultConfig {
applicationId = "com.android.customitemview"
minSdk = 24
targetSdk = 33
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
viewBinding = true
}
}
dependencies {
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.9.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.fragment:fragment-ktx:1.6.1")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}