ConstraintLayout
- ConstraintLayout is a ViewGroup which allows you to position and size widgets in a flexible way: Constraint
- Relative: with constraint & margin value & fixed width/height
- You should check all for horizontal & vertical
- constraint for start/end, width
- constraint for top/bottom, height
- To use 'match_constraint (= 0dp)', both side must be set
- If you use 'match_constraint (= 0dp)', constraint is not essential
- Check your view is properly positioned
Guideline
- You can use guidelines to set constraints properly
- Guideline can be Xdp from left/right/up/down
- or X% horizontally/vertically
- You can divide the screen into sections
- Scrollable View
- Only one component can be in
- Put ImageView and TextView inside the ScrollView
- Directly put two views is imporssible
- Put it inside LinearLayout inside of ScrollView
ListView
- Think about you are making listview manually
- You need to iterate with the number of items
- and construct the view by objectifying each element in each item
- With Inflater, you can make use of layout XML instead of making and adjusting all element
- With Adapter, you do not need to take care of iteration
- Just listView.adpater = myAdapterInstance do all!
- It is calling setter, listView.setAdapter(...)
Chatroom List
- MainActivity.kt
- ChatRoom.kt
- ChatRoomAdapter.kt
- activity_main.xml
- item_chatroom.xml
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline111"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.1" />
<ListView
android:id="@+id/listview"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/guideline222"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline111" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline222"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.9" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline1111"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.25" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2222"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline3333"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.75" />
<TextView
android:id="@+id/textView2"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="Chatting"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintBottom_toTopOf="@+id/guideline111"
app:layout_constraintEnd_toStartOf="@+id/guideline2222"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="A"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline1111"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline222" />
<Button
android:id="@+id/button3"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="B"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline2222"
app:layout_constraintStart_toStartOf="@+id/guideline1111"
app:layout_constraintTop_toTopOf="@+id/guideline222" />
<Button
android:id="@+id/button5"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="C"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline3333"
app:layout_constraintStart_toStartOf="@+id/guideline2222"
app:layout_constraintTop_toTopOf="@+id/guideline222" />
<Button
android:id="@+id/button8"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="D"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline3333"
app:layout_constraintTop_toTopOf="@+id/guideline222" />
</androidx.constraintlayout.widget.ConstraintLayout>
item_chatroom.xml
<?xml version="1.0" encoding="utf-8"?>
<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="wrap_content">
<ImageView
android:id="@+id/imageViewProfile"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@drawable/ic_launcher_background" />
<TextView
android:id="@+id/textViewRoomName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toEndOf="@+id/imageViewProfile"
app:layout_constraintTop_toTopOf="@+id/imageViewProfile" />
<TextView
android:id="@+id/textViewRecentChat"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="@+id/imageViewProfile"
app:layout_constraintEnd_toStartOf="@+id/textViewUnread"
app:layout_constraintStart_toEndOf="@+id/imageViewProfile"
app:layout_constraintTop_toBottomOf="@+id/textViewRoomName" />
<TextView
android:id="@+id/textViewGroupSize"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="@+id/textViewRoomName"
app:layout_constraintStart_toEndOf="@+id/textViewRoomName"
app:layout_constraintTop_toTopOf="@+id/textViewRoomName" />
<TextView
android:id="@+id/textViewLastTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textViewUnread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="TextView"
android:textColor="#F44336"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textViewLastTime" />
</androidx.constraintlayout.widget.ConstraintLayout>
ChatRoom.kt
package com.example.week5
class ChatRoom (
val name: String,
val lastChat: String,
val thumbnail: Int,
val groupNumber: Int,
val lastTime: String,
val unread: Int
){
}
ChatRoomAdapter.kt
package com.example.week5
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.TextView
class ChatRoomAdapter (val data: ArrayList<ChatRoom>, val context: Context): BaseAdapter() {
override fun getCount(): Int {
return data.size
}
override fun getItem(position: Int): Any {
return data[position]
}
override fun getItemId(position: Int): Long {
return 0
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val generatedView = inflater.inflate(R.layout.item_chatroom, null)
val textViewName = generatedView.findViewById<TextView>(R.id.textViewRoomName)
val textViewChat = generatedView.findViewById<TextView>(R.id.textViewRecentChat)
val textViewGroupNumber = generatedView.findViewById<TextView>(R.id.textViewGroupSize)
val textViewTime = generatedView.findViewById<TextView>(R.id.textViewLastTime)
val imageViewThumbnail = generatedView.findViewById<ImageView>(R.id.imageViewProfile)
val textViewUnread = generatedView.findViewById<TextView>(R.id.textViewUnread)
textViewUnread.text = "" + data[position].unread
textViewName.text = data[position].name
textViewChat.text = data[position].lastChat
textViewTime.text = data[position].lastTime
//textViewGroupNumber.text = "" + data[position].groupNumber
textViewGroupNumber.text = if (data[position].groupNumber != 1) "" + data[position].groupNumber else ""
imageViewThumbnail.setImageResource(data[position].thumbnail)
return generatedView
}
}
- hiding the number of people in group when it is 1
MainActivity.kt
package com.example.week5
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ListView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val items = ArrayList<ChatRoom>()
items.add(ChatRoom("Kakao T", "Please leave review.", R.drawable.ic_launcher_background, 1, "8:24 p.m.", 1))
items.add(ChatRoom("SKKU Software", "Anybody taking MAP lecture? This week lab session is too hard. Can anybody give me the hint? I will be very happy if you help. If nobody help me, I will be very sad.", R.drawable.ic_launcher_background, 512, "7:15 p.m.", 128))
items.add(ChatRoom("Brother", "Hey.", R.drawable.ic_launcher_background, 1, "4:21 p.m.", 12))
items.add(ChatRoom("Family", "Emoji", R.drawable.ic_launcher_background, 4, "4:05 p.m.", 5))
items.add(ChatRoom("Study group", "See you tomorrow!", R.drawable.ic_launcher_background, 5, "4:01 p.m.", 2))
items.add(ChatRoom("Yogiyo", "How was the food?", R.drawable.ic_launcher_background, 1, "3:24 p.m.", 1))
items.add(ChatRoom("lorem ipsum", "dolor", R.drawable.ic_launcher_background, 6, "2:22 p.m.", 123))
items.add(ChatRoom("Placeholder", "Placeholder", R.drawable.ic_launcher_background, 12, "11:58 a.m.", 5))
val myAdapter = ChatRoomAdapter(items, applicationContext)
val listView = findViewById<ListView>(R.id.listview)
listView.adapter = myAdapter
}
}
- Implement ListView using ChatRoomAdapter