Skip to content

Commit 020c951

Browse files
committed
Use RecyclerView to replace ListView & GridView
1 parent af153fe commit 020c951

16 files changed

+179
-168
lines changed

baseLib/src/main/java/me/ycdev/android/lib/common/apps/AppsLoader.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class AppsLoader private constructor(cxt: Context) {
4040

4141
if (listener != null) {
4242
i++
43-
val percent = MiscUtils.calcProgressPercent(1, 50, i, n)
43+
val percent = MiscUtils.calcProgressPercent(1, 90, i, n)
4444
listener.onProgressUpdated(percent, item)
4545
}
4646
}
@@ -67,7 +67,7 @@ class AppsLoader private constructor(cxt: Context) {
6767
}
6868
if (listener != null && item != null) {
6969
i++
70-
val percent = MiscUtils.calcProgressPercent(51, 100, i, n)
70+
val percent = MiscUtils.calcProgressPercent(91, 100, i, n)
7171
listener.onProgressUpdated(percent, item)
7272
}
7373
}

uiLib/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ android {
1010
minSdkVersion versions.minSdk
1111
}
1212

13+
viewBinding.enabled = true
14+
1315
lintOptions {
1416
disable 'UnusedResources'
1517
}
@@ -21,6 +23,8 @@ dependencies {
2123

2224
implementation deps.kotlin.stdlib
2325
implementation deps.androidx.appcompat
26+
implementation deps.androidx.material
27+
implementation deps.androidx.recyclerview
2428
}
2529

2630
project.ext {

uiLib/src/main/java/me/ycdev/android/lib/commonui/activity/GridEntriesActivity.kt

Lines changed: 67 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,31 @@ import android.content.Context
55
import android.content.Intent
66
import android.os.AsyncTask
77
import android.os.Bundle
8+
import android.view.LayoutInflater
89
import android.view.View
9-
import android.widget.AdapterView
10-
import android.widget.GridView
11-
import android.widget.TextView
10+
import android.view.ViewGroup
11+
import android.widget.ProgressBar
1212
import android.widget.Toast
1313
import androidx.annotation.LayoutRes
14+
import androidx.appcompat.widget.Toolbar
15+
import androidx.recyclerview.widget.GridLayoutManager
16+
import androidx.recyclerview.widget.RecyclerView
1417
import me.ycdev.android.arch.ArchConstants
1518
import me.ycdev.android.arch.ArchConstants.IntentType
1619
import me.ycdev.android.arch.activity.AppCompatBaseActivity
1720
import me.ycdev.android.arch.wrapper.ToastHelper
1821
import me.ycdev.android.lib.common.utils.IntentUtils
1922
import me.ycdev.android.lib.common.wrapper.BroadcastHelper
2023
import me.ycdev.android.lib.commonui.R
21-
import me.ycdev.android.lib.commonui.base.ListAdapterBase
22-
import me.ycdev.android.lib.commonui.base.ViewHolderBase
24+
import me.ycdev.android.lib.commonui.databinding.CommonuiGridEntriesItemBinding
25+
import me.ycdev.android.lib.commonui.recyclerview.MarginItemDecoration
2326

2427
@Suppress("MemberVisibilityCanBePrivate", "unused")
25-
abstract class GridEntriesActivity : AppCompatBaseActivity(), AdapterView.OnItemClickListener,
26-
AdapterView.OnItemLongClickListener {
28+
abstract class GridEntriesActivity : AppCompatBaseActivity() {
2729

28-
protected lateinit var adapter: SystemEntriesAdapter
29-
protected lateinit var gridView: GridView
30+
protected lateinit var entriesAdapter: SystemEntriesAdapter
31+
protected lateinit var gridView: RecyclerView
32+
protected lateinit var loadingView: ProgressBar
3033

3134
protected open val contentViewLayout: Int
3235
@LayoutRes get() = R.layout.commonui_grid_entries
@@ -53,15 +56,15 @@ abstract class GridEntriesActivity : AppCompatBaseActivity(), AdapterView.OnItem
5356
override val clickAction: ((Context) -> Unit)? = ::onItemClicked
5457
override val longClickAction: ((Context) -> Unit)? = ::onItemLongClicked
5558

56-
fun onItemClicked(context: Context) {
59+
protected open fun onItemClicked(context: Context) {
5760
if (type == ArchConstants.INTENT_TYPE_ACTIVITY) {
5861
IntentUtils.startActivity(context, intent)
5962
} else if (type == ArchConstants.INTENT_TYPE_BROADCAST) {
6063
BroadcastHelper.sendToExternal(context, intent, perm)
6164
}
6265
}
6366

64-
private fun onItemLongClicked(context: Context) {
67+
protected open fun onItemLongClicked(context: Context) {
6568
ToastHelper.show(context, desc, Toast.LENGTH_LONG)
6669
}
6770
}
@@ -70,71 +73,91 @@ abstract class GridEntriesActivity : AppCompatBaseActivity(), AdapterView.OnItem
7073
super.onCreate(savedInstanceState)
7174
setContentView(contentViewLayout)
7275

73-
adapter = SystemEntriesAdapter(this)
76+
val toolbar = findViewById<Toolbar>(R.id.toolbar)
77+
setSupportActionBar(toolbar)
78+
supportActionBar?.setDisplayHomeAsUpEnabled(true)
79+
80+
entriesAdapter = SystemEntriesAdapter(this)
7481

7582
gridView = findViewById(R.id.grid)
76-
gridView.adapter = adapter
77-
gridView.onItemClickListener = this
78-
gridView.onItemLongClickListener = this
83+
loadingView = findViewById(R.id.progress)
84+
85+
gridView.apply {
86+
adapter = entriesAdapter
87+
layoutManager = GridLayoutManager(this@GridEntriesActivity, 3)
88+
addItemDecoration(MarginItemDecoration.create(getGridEntriesMargin()))
89+
}
7990

8091
loadItems()
8192
}
8293

94+
open fun getGridEntriesMargin(): Int {
95+
val a = obtainStyledAttributes(intArrayOf(R.attr.commonuiGridEntriesItemMargin))
96+
val margin: Int = a.getDimensionPixelSize(0, 0)
97+
a.recycle()
98+
return margin
99+
}
100+
83101
@SuppressLint("StaticFieldLeak")
84-
private fun loadItems() {
102+
protected open fun loadItems() {
85103
if (needLoadIntentsAsync) {
104+
loadingView.visibility = View.VISIBLE
105+
86106
object : AsyncTask<Void, Void, List<Entry>>() {
87107
override fun doInBackground(vararg params: Void): List<Entry> {
88108
return intents
89109
}
90110

91111
override fun onPostExecute(result: List<Entry>) {
92-
adapter.setData(intents)
112+
loadingView.visibility = View.GONE
113+
entriesAdapter.data = intents
114+
entriesAdapter.notifyDataSetChanged()
93115
}
94116
}.execute()
95117
} else {
96-
adapter.setData(intents)
118+
loadingView.visibility = View.GONE
119+
entriesAdapter.data = intents
97120
}
98121
}
99122

100-
override fun onItemClick(parent: AdapterView<*>, view: View, position: Int, id: Long) {
101-
val item = adapter.getItem(position)
102-
item.clickAction?.invoke(this)
103-
}
104-
105-
override fun onItemLongClick(
106-
parent: AdapterView<*>,
107-
view: View,
108-
position: Int,
109-
id: Long
110-
): Boolean {
111-
val item = adapter.getItem(position)
112-
item.longClickAction?.invoke(this)
113-
return true
114-
}
115-
116123
/**
117124
* Decide if we need to invoke [.getIntent] async.
118125
* @return true for async and false for sync. false by default
119126
*/
120127
protected open val needLoadIntentsAsync: Boolean = false
121128

122-
protected open class SystemEntriesAdapter(cxt: Context) :
123-
ListAdapterBase<Entry, SystemEntriesAdapter.ViewHolder>(cxt) {
129+
protected open class SystemEntriesAdapter(val context: Context) :
130+
RecyclerView.Adapter<SystemEntriesAdapter.ViewHolder>() {
131+
132+
var data: List<Entry>? = null
133+
134+
private fun getItem(position: Int): Entry {
135+
return data!![position]
136+
}
124137

125-
override val itemLayoutResId: Int = R.layout.commonui_grid_entries_item
138+
override fun getItemCount(): Int {
139+
return data?.size ?: 0
140+
}
126141

127-
override fun createViewHolder(itemView: View, position: Int): ViewHolder {
128-
return ViewHolder(itemView, position)
142+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
143+
val itemView = LayoutInflater.from(context)
144+
.inflate(R.layout.commonui_grid_entries_item, parent, false)
145+
return ViewHolder(itemView)
129146
}
130147

131-
override fun bindView(item: Entry, holder: ViewHolder) {
132-
holder.titleView.text = item.title
148+
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
149+
val item = getItem(position)
150+
holder.binding.title.text = item.title
151+
152+
holder.binding.root.setOnClickListener { item.clickAction?.invoke(context) }
153+
holder.binding.root.setOnLongClickListener {
154+
item.longClickAction?.invoke(context)
155+
return@setOnLongClickListener true
156+
}
133157
}
134158

135-
class ViewHolder(itemView: View, position: Int) :
136-
ViewHolderBase(itemView, position) {
137-
var titleView: TextView = itemView.findViewById(R.id.title)
159+
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
160+
val binding: CommonuiGridEntriesItemBinding = CommonuiGridEntriesItemBinding.bind(itemView)
138161
}
139162
}
140163
}

uiLib/src/main/java/me/ycdev/android/lib/commonui/base/ListAdapterBase.kt

Lines changed: 0 additions & 74 deletions
This file was deleted.

uiLib/src/main/java/me/ycdev/android/lib/commonui/base/ViewHolderBase.kt

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package me.ycdev.android.lib.commonui.recyclerview
2+
3+
import android.graphics.Rect
4+
import android.view.View
5+
import androidx.recyclerview.widget.RecyclerView
6+
7+
class MarginItemDecoration(
8+
private val marginLeft: Int,
9+
private val marginTop: Int,
10+
private val marginRight: Int,
11+
private val marginBottom: Int
12+
) : RecyclerView.ItemDecoration() {
13+
override fun getItemOffsets(
14+
outRect: Rect,
15+
view: View,
16+
parent: RecyclerView,
17+
state: RecyclerView.State
18+
) {
19+
outRect.apply {
20+
left = marginLeft
21+
top = marginTop
22+
right = marginRight
23+
bottom = marginBottom
24+
}
25+
}
26+
27+
companion object {
28+
fun create(margin: Int): MarginItemDecoration {
29+
return MarginItemDecoration(margin, margin, margin, margin)
30+
}
31+
}
32+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<selector xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item android:drawable="@drawable/commonui_scrollbar_thumb_normal" />
4+
</selector>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<shape xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:shape="rectangle">
4+
<solid android:color="?attr/colorPrimaryDark" />
5+
<corners android:radius="10dp" />
6+
</shape>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<selector xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item android:drawable="@drawable/commonui_scrollbar_track_normal" />
4+
</selector>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<shape xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:shape="rectangle">
4+
<solid android:color="@android:color/darker_gray" />
5+
</shape>

0 commit comments

Comments
 (0)