From 4c4be4a07b4d366b6d71e976f46ebcdd716d22c3 Mon Sep 17 00:00:00 2001 From: Gena Date: Tue, 28 Oct 2025 13:46:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94.=D0=97.=20=D0=BF=D0=BE=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=20RecyclerView=20#2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 8 + .../java/otus/gpb/recyclerview/ChatAdapter.kt | 51 ++++++ .../otus/gpb/recyclerview/ChatDiffCallback.kt | 13 ++ .../java/otus/gpb/recyclerview/ChatItem.kt | 15 ++ .../otus/gpb/recyclerview/ChatViewHolder.kt | 6 + .../otus/gpb/recyclerview/MainActivity.kt | 122 +++++++++++++- app/src/main/res/drawable/avatar.png | Bin 0 -> 7438 bytes app/src/main/res/drawable/check.xml | 2 + app/src/main/res/drawable/check1.xml | 14 ++ app/src/main/res/drawable/circle.xml | 2 + app/src/main/res/drawable/doublecheck.xml | 14 ++ app/src/main/res/drawable/mute.xml | 14 ++ app/src/main/res/drawable/scam.xml | 27 ++++ app/src/main/res/layout/activity_main.xml | 6 +- app/src/main/res/layout/chat_item.xml | 149 ++++++++++++++++++ 15 files changed, 441 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/otus/gpb/recyclerview/ChatAdapter.kt create mode 100644 app/src/main/java/otus/gpb/recyclerview/ChatDiffCallback.kt create mode 100644 app/src/main/java/otus/gpb/recyclerview/ChatItem.kt create mode 100644 app/src/main/java/otus/gpb/recyclerview/ChatViewHolder.kt create mode 100644 app/src/main/res/drawable/avatar.png create mode 100644 app/src/main/res/drawable/check.xml create mode 100644 app/src/main/res/drawable/check1.xml create mode 100644 app/src/main/res/drawable/circle.xml create mode 100644 app/src/main/res/drawable/doublecheck.xml create mode 100644 app/src/main/res/drawable/mute.xml create mode 100644 app/src/main/res/drawable/scam.xml create mode 100644 app/src/main/res/layout/chat_item.xml diff --git a/app/build.gradle b/app/build.gradle index 54e4eac..3302ed5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,6 +30,12 @@ android { kotlinOptions { jvmTarget = '1.8' } + buildFeatures { + viewBinding = true + } + dataBinding { + enabled = true + } } dependencies { @@ -41,4 +47,6 @@ dependencies { testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + implementation 'androidx.databinding:databinding-runtime:8.10.0' + implementation 'it.xabaras.android:recyclerview-swipedecorator:1.4' } \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatAdapter.kt b/app/src/main/java/otus/gpb/recyclerview/ChatAdapter.kt new file mode 100644 index 0000000..a370857 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatAdapter.kt @@ -0,0 +1,51 @@ +package otus.gpb.recyclerview + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.ListAdapter +import otus.gpb.recyclerview.databinding.ChatItemBinding +import android.view.View.INVISIBLE +import android.view.View.VISIBLE + +class ChatAdapter: ListAdapter(ChatDiffCallback()) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChatViewHolder { + val binding = ChatItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return ChatViewHolder(binding) + } + + override fun onBindViewHolder(holder: ChatViewHolder, position: Int) { + val chatItem = getItem(position) + val binding = holder.binding + binding.textName.setText(chatItem.name) + binding.textStatus.setText(chatItem.status) + binding.message.setText(chatItem.message) + binding.time.setText(chatItem.time) + + binding.iconVerified.visibility = if (chatItem.verified) VISIBLE else INVISIBLE + binding.iconScam.visibility = if (chatItem.scam) VISIBLE else INVISIBLE + binding.iconMute.visibility = if (chatItem.mute) VISIBLE else INVISIBLE + binding.counter.visibility = if (chatItem.counter > 0) VISIBLE else INVISIBLE + binding.counter.text = chatItem.counter.toString() + binding.time.text = chatItem.time + binding.delivered.visibility = if (chatItem.delivered && !chatItem.read) VISIBLE else INVISIBLE + + val id: Int? = if (chatItem.read) R.drawable.doublecheck + else if (chatItem.delivered && !chatItem.read) R.drawable.check + else if (chatItem.delivered && chatItem.read) R.drawable.doublecheck + else null + + if (id != null) { + binding.delivered.setImageResource(id) + binding.delivered.visibility = VISIBLE + } + else{ + binding.delivered.visibility = INVISIBLE + } + } + + fun submitNewList(list: List){ + submitList(list) + } +} diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatDiffCallback.kt b/app/src/main/java/otus/gpb/recyclerview/ChatDiffCallback.kt new file mode 100644 index 0000000..2721371 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatDiffCallback.kt @@ -0,0 +1,13 @@ +package otus.gpb.recyclerview + +import androidx.recyclerview.widget.DiffUtil + +class ChatDiffCallback: DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: ChatItem, newItem: ChatItem): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: ChatItem, newItem: ChatItem): Boolean { + return oldItem == newItem + } +} diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatItem.kt b/app/src/main/java/otus/gpb/recyclerview/ChatItem.kt new file mode 100644 index 0000000..0d30d6a --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatItem.kt @@ -0,0 +1,15 @@ +package otus.gpb.recyclerview + +data class ChatItem( + val id: Int, + val name: String, + val status: String, + val message: String, + val counter: Int, + val verified: Boolean, + val mute: Boolean, + val scam: Boolean, + val delivered: Boolean, + val read: Boolean, + val time: String, +) diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatViewHolder.kt b/app/src/main/java/otus/gpb/recyclerview/ChatViewHolder.kt new file mode 100644 index 0000000..23c42b3 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatViewHolder.kt @@ -0,0 +1,6 @@ +package otus.gpb.recyclerview + +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import otus.gpb.recyclerview.databinding.ChatItemBinding + +class ChatViewHolder(val binding: ChatItemBinding): ViewHolder(binding.root) diff --git a/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt b/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt index e2cdca7..05dc641 100644 --- a/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt +++ b/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt @@ -2,11 +2,131 @@ package otus.gpb.recyclerview import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import otus.gpb.recyclerview.databinding.ActivityMainBinding +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView +import it.xabaras.android.recyclerview.swipedecorator.RecyclerViewSwipeDecorator +import android.graphics.Canvas +import androidx.recyclerview.widget.LinearLayoutManager +import kotlin.random.Random class MainActivity : AppCompatActivity() { + private val binding: ActivityMainBinding by lazy { + ActivityMainBinding.inflate(layoutInflater) + } + private var chatList: MutableList = mutableListOf() + private lateinit var adapter: ChatAdapter + var lastId = 0 + var previousItemsCount = 0 + private var pageLoad = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) + setContentView(binding.root) + adapter = ChatAdapter() + binding.recyclerView.adapter = adapter + + val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.SimpleCallback( + 0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT + ) { + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ): Boolean { + return false + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + val position = viewHolder.adapterPosition + when(direction){ + ItemTouchHelper.LEFT -> { + removeItem(position) + } + ItemTouchHelper.RIGHT -> { + removeItem(position) + } + } + } + + override fun onChildDraw( + c: Canvas, + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + dX: Float, + dY: Float, + actionState: Int, + isCurrentlyActive: Boolean + ) { + RecyclerViewSwipeDecorator.Builder( + c, + recyclerView, + viewHolder, + dX, + dY, + actionState, + isCurrentlyActive + ).create().decorate() + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive) + } + }) + itemTouchHelper.attachToRecyclerView(binding.recyclerView) + createItems(20) + setScrollListener() + } + + private fun setScrollListener(){ + binding.recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { + + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + val layoutManager = recyclerView.layoutManager as LinearLayoutManager + val itemsCount = layoutManager.itemCount + val lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition() + if (pageLoad && itemsCount > previousItemsCount) { + pageLoad = false + previousItemsCount = itemsCount + } + if (!pageLoad && lastVisibleItem >= itemsCount - 5) { + getNextPage() + } + } + }) + } + + + private fun getNextPage() { + pageLoad = true + createItems(20) + } + + private fun removeItem(position: Int){ + val item = adapter.currentList[position] + chatList.apply { + remove(item) + } + adapter.notifyItemRemoved(position) + } + + private fun createItems(size: Int){ + for (i in 1..size) { + chatList.add( + ChatItem( + lastId++, + "Name " + "$lastId", + "status " + "$lastId", + "Message " + "$lastId", + Random.nextInt(10), + Random.nextBoolean(), + Random.nextBoolean(), + Random.nextBoolean(), + Random.nextBoolean(), + Random.nextBoolean(), + "12:10" + ) + ) + } + adapter.submitList(chatList) + adapter.notifyDataSetChanged() } } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar.png b/app/src/main/res/drawable/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..c96145f65a2b8189327d063c5f53f061298a2252 GIT binary patch literal 7438 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 M07*qoM6N<$f&(jv{{R30 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/check.xml b/app/src/main/res/drawable/check.xml new file mode 100644 index 0000000..e8b21b0 --- /dev/null +++ b/app/src/main/res/drawable/check.xml @@ -0,0 +1,2 @@ + + diff --git a/app/src/main/res/drawable/check1.xml b/app/src/main/res/drawable/check1.xml new file mode 100644 index 0000000..48b7d4d --- /dev/null +++ b/app/src/main/res/drawable/check1.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/circle.xml b/app/src/main/res/drawable/circle.xml new file mode 100644 index 0000000..27cde7b --- /dev/null +++ b/app/src/main/res/drawable/circle.xml @@ -0,0 +1,2 @@ + + diff --git a/app/src/main/res/drawable/doublecheck.xml b/app/src/main/res/drawable/doublecheck.xml new file mode 100644 index 0000000..c71c8ba --- /dev/null +++ b/app/src/main/res/drawable/doublecheck.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/mute.xml b/app/src/main/res/drawable/mute.xml new file mode 100644 index 0000000..dc59ee4 --- /dev/null +++ b/app/src/main/res/drawable/mute.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/scam.xml b/app/src/main/res/drawable/scam.xml new file mode 100644 index 0000000..b77d9ab --- /dev/null +++ b/app/src/main/res/drawable/scam.xml @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2d026df..14b87f2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,11 +3,15 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/white" + xmlns:app="http://schemas.android.com/apk/res-auto" tools:context=".MainActivity"> + android:layout_height="match_parent" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/chat_item" /> \ No newline at end of file diff --git a/app/src/main/res/layout/chat_item.xml b/app/src/main/res/layout/chat_item.xml new file mode 100644 index 0000000..92efb23 --- /dev/null +++ b/app/src/main/res/layout/chat_item.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +