From 7eea3aafcd387eb252ae3b07aa96ec381fd2c04a Mon Sep 17 00:00:00 2001 From: Vp-Ma Date: Mon, 5 Jan 2026 09:46:22 +0300 Subject: [PATCH] Homework_10 implementation(RecyclerView) --- app/build.gradle | 3 + .../otus/gpb/recyclerview/ChatTlgAdapter.kt | 35 +++++++ .../otus/gpb/recyclerview/ChatTlgService.kt | 50 ++++++++++ .../gpb/recyclerview/ChatTlgSwipeDelete.kt | 35 +++++++ .../gpb/recyclerview/ChatTlgViewHolder.kt | 48 ++++++++++ .../otus/gpb/recyclerview/MainActivity.kt | 59 +++++++++--- app/src/main/res/drawable/avatar_1.png | Bin 0 -> 2677 bytes app/src/main/res/drawable/avatar_2.png | Bin 0 -> 2836 bytes app/src/main/res/drawable/avatar_3.png | Bin 0 -> 2252 bytes app/src/main/res/drawable/avatar_4.png | Bin 0 -> 2625 bytes app/src/main/res/drawable/avatar_5.png | Bin 0 -> 2888 bytes app/src/main/res/drawable/avatar_6.png | Bin 0 -> 2349 bytes app/src/main/res/drawable/avatar_7.png | Bin 0 -> 2677 bytes app/src/main/res/drawable/ic_person.xml | 10 ++ app/src/main/res/drawable/menu.png | Bin 0 -> 307 bytes app/src/main/res/drawable/round_shape.xml | 10 ++ app/src/main/res/layout/activity_main.xml | 49 +++++++--- app/src/main/res/layout/item_tlg_chat.xml | 86 ++++++++++++++++++ app/src/main/res/values/colors.xml | 21 +++-- app/src/main/res/values/strings.xml | 4 +- app/src/main/res/values/themes.xml | 30 +++--- 21 files changed, 391 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/otus/gpb/recyclerview/ChatTlgAdapter.kt create mode 100644 app/src/main/java/otus/gpb/recyclerview/ChatTlgService.kt create mode 100644 app/src/main/java/otus/gpb/recyclerview/ChatTlgSwipeDelete.kt create mode 100644 app/src/main/java/otus/gpb/recyclerview/ChatTlgViewHolder.kt create mode 100644 app/src/main/res/drawable/avatar_1.png create mode 100644 app/src/main/res/drawable/avatar_2.png create mode 100644 app/src/main/res/drawable/avatar_3.png create mode 100644 app/src/main/res/drawable/avatar_4.png create mode 100644 app/src/main/res/drawable/avatar_5.png create mode 100644 app/src/main/res/drawable/avatar_6.png create mode 100644 app/src/main/res/drawable/avatar_7.png create mode 100644 app/src/main/res/drawable/ic_person.xml create mode 100644 app/src/main/res/drawable/menu.png create mode 100644 app/src/main/res/drawable/round_shape.xml create mode 100644 app/src/main/res/layout/item_tlg_chat.xml diff --git a/app/build.gradle b/app/build.gradle index 54e4eac..32eb90e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,6 +38,9 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'com.github.javafaker:javafaker:1.0.2' + implementation 'com.github.bumptech.glide:glide:4.15.1' + implementation 'androidx.cardview:cardview:1.0.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatTlgAdapter.kt b/app/src/main/java/otus/gpb/recyclerview/ChatTlgAdapter.kt new file mode 100644 index 0000000..1cbad53 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatTlgAdapter.kt @@ -0,0 +1,35 @@ +package otus.gpb.recyclerview + +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide + +class ChatTlgAdapter( ):RecyclerView.Adapter(){ + + private var ChatItemList = mutableListOf() + fun setList(list: List) { + ChatItemList = list.toList() as MutableList + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChatTlgViewHolder { + + val view = LayoutInflater.from(parent.context) + val binding = view.inflate( R.layout.item_tlg_chat, parent, false ) + return ChatTlgViewHolder( binding ) + } + + override fun getItemCount(): Int { + return ChatItemList.size + } + + override fun onBindViewHolder( chatViewHolder: ChatTlgViewHolder, position: Int) { + chatViewHolder.bind( ChatItemList[position] ) + } + fun onItemSwipe( position:Int, direction:Int ){ + ChatItemList.removeAt(position) + notifyItemRemoved(position) + } +} diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatTlgService.kt b/app/src/main/java/otus/gpb/recyclerview/ChatTlgService.kt new file mode 100644 index 0000000..ac24adb --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatTlgService.kt @@ -0,0 +1,50 @@ +package otus.gpb.recyclerview + +import com.github.javafaker.Faker + +data class ChatTlgItem( +// TODO There should be a real structure with Tg chat elements + val chatName: String, // Chat name + val messageAuthor: String, // Message author + val messageTitle: String, // Message fragment + val messageTime: String, // Message recv time + val messageCnt: Int, // Message count + val photo: String // Avatar +) + +class ChatTlgService( private val isNewList: Boolean ){ + + private var itemsCnt:Int = 6 + private var chatList = mutableListOf() + + init { + if( isNewList ) itemsCnt = 20 + val faker = Faker.instance() + + chatList = (0..itemsCnt).map { + ChatTlgItem( + chatName = faker.name().fullName(), + messageAuthor = faker.name().fullName(), + messageTitle = faker.book().title(), + messageTime = faker.numerify("##:## AM"),//"11:25 AM", + messageCnt = faker.number().numberBetween(1,100), + photo = IMAGES[it % IMAGES.size], + ) + }.toMutableList() + } + + fun getTlgChat() : List{ + return chatList + } + + companion object { + private val IMAGES = mutableListOf( + "avatar_1", + "avatar_2", + "avatar_3", + "avatar_4", + "avatar_5", + "avatar_6" + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatTlgSwipeDelete.kt b/app/src/main/java/otus/gpb/recyclerview/ChatTlgSwipeDelete.kt new file mode 100644 index 0000000..3ba2103 --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatTlgSwipeDelete.kt @@ -0,0 +1,35 @@ +package otus.gpb.recyclerview + +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView + +class TlgItemTouchHelper( val adapter: ChatTlgAdapter ) : ItemTouchHelper.Callback() { + + override fun getMovementFlags( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder + ): Int { + val swipeFlags = ItemTouchHelper.START + return makeMovementFlags(0 , swipeFlags) + } + + override fun isItemViewSwipeEnabled(): Boolean { + return true + } + + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ): Boolean { + return false + } + + override fun onSwiped( + viewHolder: RecyclerView.ViewHolder, + direction: Int + ) { + val itemPosition:Int = viewHolder.adapterPosition + adapter.onItemSwipe( itemPosition, direction ) + } +} diff --git a/app/src/main/java/otus/gpb/recyclerview/ChatTlgViewHolder.kt b/app/src/main/java/otus/gpb/recyclerview/ChatTlgViewHolder.kt new file mode 100644 index 0000000..775426b --- /dev/null +++ b/app/src/main/java/otus/gpb/recyclerview/ChatTlgViewHolder.kt @@ -0,0 +1,48 @@ +package otus.gpb.recyclerview + +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import org.apache.commons.lang3.ClassUtils.getPackageName + +class ChatTlgViewHolder( private val view : View ) : RecyclerView.ViewHolder( view ){ + + private val image: ImageView by lazy { view.findViewById(R.id.imageView) } + private val chatName: TextView by lazy { view.findViewById(R.id.chatNameTextView) } + private val messAuthor: TextView by lazy { view.findViewById(R.id.authorTextView) } + private val messageText: TextView by lazy { view.findViewById(R.id.messageTextView) } + private val messageTime: TextView by lazy { view.findViewById(R.id.timeTextView) } + private val messageCnt: TextView by lazy { view.findViewById(R.id.cntMessTextView) } + + + fun bind( chatTlgItem: ChatTlgItem ) { + + chatName.text = chatTlgItem.chatName + messAuthor.text = chatTlgItem.messageAuthor + messageText.text = chatTlgItem.messageTitle + messageTime.text = chatTlgItem.messageTime + messageCnt.text = chatTlgItem.messageCnt.toString() + + image.setImageResource(R.drawable.ic_person) + + val resourceName = chatTlgItem.photo + val res = view.context.getResources() + val packageName = view.context.packageName + val resourceId = res.getIdentifier(resourceName, "drawable", packageName ) + if (resourceId != 0) { + + image.setImageResource(resourceId) + /* + Glide.with(view.context) + .load(resourceId) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.ALL ) + .circleCrop() + .into(image) + */ + } + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt b/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt index e2cdca7..048a470 100644 --- a/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt +++ b/app/src/main/java/otus/gpb/recyclerview/MainActivity.kt @@ -1,12 +1,49 @@ -package otus.gpb.recyclerview - -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle - -class MainActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - } +package otus.gpb.recyclerview + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView + +class MainActivity : AppCompatActivity() { + + private var ChatTlgList:List = mutableListOf() + private lateinit var chatTlgAdapter:ChatTlgAdapter + private lateinit var dividerItemDecoration : DividerItemDecoration + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + ChatTlgList = ChatTlgService( true ).getTlgChat() + chatTlgAdapter = ChatTlgAdapter( ) + + val manager = LinearLayoutManager(this) // LayoutManager + val rv = findViewById(R.id.recyclerView) + rv.adapter = chatTlgAdapter + rv.layoutManager = manager + dividerItemDecoration = DividerItemDecoration( + rv.context, + (rv.layoutManager as LinearLayoutManager).orientation + ) + rv.addItemDecoration(dividerItemDecoration) + + chatTlgAdapter.setList( ChatTlgList ) + + var callback = TlgItemTouchHelper( chatTlgAdapter ) + var itemTouchHelper = ItemTouchHelper( callback ) + itemTouchHelper.attachToRecyclerView( rv ) + rv.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + if (!recyclerView.canScrollVertically(1)) { + var chatAddList = ChatTlgService( false ) + ChatTlgList = ChatTlgList + chatAddList.getTlgChat() + chatTlgAdapter.setList( ChatTlgList ) + } + } + }) + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_1.png b/app/src/main/res/drawable/avatar_1.png new file mode 100644 index 0000000000000000000000000000000000000000..59b42a7861e6f30199feaa042a6a5427ee4c4cf3 GIT binary patch literal 2677 zcmV-*3X1iKP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf3JOU?K~z{rtypV} zRA(7}zH?^I%xOVb}s3`XM* zNu^OCnxIiE)+*Z225AK7k88yFho`Yh9vm6ER_ajT%aS-&Das=Vkyi}QgYhCHM8R>#r-@L9kfO%vRuqcu1 z$^VlwRk=fulRt$-IU3?B0=2gBk^c#xC{{`#opxZ^WF^gOYEYRcS&(u?7Bs-);XQtk z;YyLaS#}!p7nBoVQ;`6(vn<=eL=^A^fQ55`nKOXW5+IS}JuhI&e?#%JgMmTd!WCdF ztPl(WUe8@XrxD9ajtUj_z;d8-Je`DAcd5hPGu zO%n=(MIg)%P}WjMWWvESPkb1y|F49{fiG>=FfuwB>xHENgANiVuwseA*S0D*a;H}} zy@<{YOuf%M2}EPOG0ma#0!-5cqU?vSI6Q6k<~H}^1^rXZQUGLbfLtJX z?AfOr=uEWCnfF}8B460d0A%VaBsl@ffrPz{>ovrv;9i(^sz^fr)WggOslryy4Uj8> ztPX80bmT&-?-rSuPVgTycab7xaM658%Gnz^Bqu;IY12&BQk|(`hzw4la1!%}^)*Fc z7Od*0q4WS8J7YI_p6h^$iC_HC;XbV`+)pOuAtE<}Tv%C=aprh}$-qUD9aN?`K@rsG zSQI)E2vsjYqUI||8!a#vd>5rNAAzBn7#ojsgCzBlB2k*v;V=NpSeq|iaZp#2DVg~s zCqPYe5N3hzxB$#<&6FJ{O_q`)ytWZ2t3y@uN(_cRkJ9RSSibph1WMNID12HBzd7Q^ zsZJZW^-ZXo^AO7F7C?DQxqb+a<(3h*!RYCi4_(0rx94Hs@AsoO(T3+XKM#Lp0~%+y!wA-(Z`4NEo{e3*_TofW zJ-Yhh7!N&;WgA~*OH+f?z+rd|12?*Wy>BT3WCJk;q{bV4k>T77iXr?y#l;R%mP1B$ zq+{JMD(=J1?cYRS_jPo2USfB020z=m6UW{^K!(aN(Q^`Be>u(_JBa;n?Z?Rr9q7Dp z3`yIEf4uWs965B5owE3+g5MA9c|*D(>X!|th|X51KOD{tP&`&>kFfhVd!C2((r;1` z#IFAimMTTcHZW^eBOX}w0G@vCi*8a+CZb5i$6%WgMx}){Yd7GD4WGt?4?l|7I6Gsu z`AN1=iOW0TF#>L{c(pUrBjyrm$|jQZ@to~eHvBXmP0G<@>!fW048sRs^CrxlHy8D_ zwP;_piay$ehK43An%96tWPl8rXj`%#KF7q$RjcVHGcc=dE`pWKSUSHFdiXsAN_}|a z&(a?%7(BddvZ=yD+rg2142p2E;o#t5pz9XF`3#JA?Z@gBjfgU`V?;bg6GXEO_SyxL(h@#;nurb-OfhoK3V0iHN0sYI~}4m@|#yg zbTw907XeVfaEy(6+~G1PzQqgWErn){y7_FNe*|ZbpTqG(AJ9HJeBKm{0NLbq23kf> zJfWex*OxKxM) z!>rbNoEcb&>$e^F{A`(3#+2`|7D1DGXnm zg_{RIfujdo@QdC1P*xUTqnj~vX?Xyz{rp|TFRsCj!>eE=7|A-Hacy;_#gSqILDjB) z`IBGr1LQh+b7g%;X~4#}wss?#WPe6*J*O8U+||TNZ(`lTnK*m!G~RskC~I;pQr!77 zkG+To%R@X6>#6BQ*U^?d?*?$4bdN$BEc7|(1}J=pK5`_bTToTX0K z6BW5c){L-IDgaP~Nt*fU_?aM63C%KE;rfxdjQdrtd%l%=iZaUT><1^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/avatar_2.png b/app/src/main/res/drawable/avatar_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1b3848a969ca4347489932be334d4bf74ea516ca GIT binary patch literal 2836 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_person.xml b/app/src/main/res/drawable/ic_person.xml new file mode 100644 index 0000000..ac99f74 --- /dev/null +++ b/app/src/main/res/drawable/ic_person.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/menu.png b/app/src/main/res/drawable/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..e34fa2daff29c5486b0080ee75b6ea4fdabea8c2 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^96-#&!3HGb=lz)rq!^2X+?^QKos)S9a~60+7BevL9RguSQ4OyKpx_Bl7sn8d;NA(gT+I#wt@n?GO0(+jo!^@N zf$iSGL&}kyNs2dC&Tai~adWQ61r=90n;DYR%Td~Nlmw*Rrk0qv55y#nu94jb$c%i^E8?BvRQC1 z^-^a4lizliOj>1*3%Um0QP}#0*>A@4nNwyy)H<7R`72}@iPT~TlYCnQgN8~ z{E0>1KDCt|+txKJELfK5;d9yLutANXhvvgwdh>j)c6ci-D+79tfx*+&&t;ucLK6VP CfqKgT literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/round_shape.xml b/app/src/main/res/drawable/round_shape.xml new file mode 100644 index 0000000..2a08a28 --- /dev/null +++ b/app/src/main/res/drawable/round_shape.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2d026df..7467957 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,13 +1,38 @@ - - - - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_tlg_chat.xml b/app/src/main/res/layout/item_tlg_chat.xml new file mode 100644 index 0000000..83d4974 --- /dev/null +++ b/app/src/main/res/layout/item_tlg_chat.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127..a07de26 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,10 +1,13 @@ - - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + #909090 + #BD3D3D + #3D61BD \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3d78b1f..4801a43 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,3 @@ - - RecyclerView + + Telegram \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 2187cf1..8ed3dde 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,16 +1,16 @@ - - - + + + \ No newline at end of file