Skip to content

Commit ffee61c

Browse files
anhanh11001iamareebjamal
authored andcommitted
fix: Improve Search Type Layout (#1648)
Detail: Make font smaller + Add checked drawable on checked type Fixes: #1581
1 parent 1f9ea9f commit ffee61c

File tree

5 files changed

+102
-16
lines changed

5 files changed

+102
-16
lines changed

app/src/main/java/org/fossasia/openevent/general/search/SearchFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ class SearchFragment : Fragment() {
8686
}
8787

8888
rootView.eventTypeTextView.setOnClickListener {
89-
SearchLocationFragmentArgs.Builder()
90-
.setFromSearchFragment(true)
89+
SearchTypeFragmentArgs.Builder()
90+
.setType(rootView.eventTypeTextView.text.toString())
9191
.build()
9292
.toBundle()
9393
.also { bundle ->
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package org.fossasia.openevent.general.search
2+
3+
import android.view.LayoutInflater
4+
import android.view.View
5+
import android.view.ViewGroup
6+
import android.widget.CheckedTextView
7+
import androidx.recyclerview.widget.RecyclerView
8+
import kotlinx.android.synthetic.main.event_type_list.view.typeTextView
9+
import org.fossasia.openevent.general.R
10+
import timber.log.Timber
11+
12+
class SearchTypeAdapter : RecyclerView.Adapter<SearchTypeViewHolder>() {
13+
private val types = ArrayList<String>()
14+
private var checkedTypePosition = -1
15+
private var listener: TypeClickListener? = null
16+
17+
fun addAll(typeList: List<String>) {
18+
if (types.isNotEmpty()) types.clear()
19+
types.addAll(typeList)
20+
}
21+
22+
fun setListener(typeListener: TypeClickListener) {
23+
listener = typeListener
24+
}
25+
26+
fun setCheckTypePosition(pos: Int) {
27+
checkedTypePosition = pos
28+
}
29+
30+
override fun onBindViewHolder(holder: SearchTypeViewHolder, position: Int) {
31+
holder.bind(types[position], checkedTypePosition == position, listener)
32+
}
33+
34+
override fun getItemCount(): Int {
35+
return types.size
36+
}
37+
38+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchTypeViewHolder {
39+
val view = LayoutInflater.from(parent.context).inflate(R.layout.event_type_list, parent, false)
40+
return SearchTypeViewHolder(view)
41+
}
42+
}
43+
44+
interface TypeClickListener {
45+
fun onClick(chosenType: String)
46+
}
47+
48+
class SearchTypeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
49+
fun bind(typeValue: String, isChecked: Boolean, listener: TypeClickListener?) {
50+
val typeView = itemView.typeTextView
51+
if (typeView is CheckedTextView) {
52+
typeView.text = typeValue
53+
if (isChecked) {
54+
Timber.d("DEBUGGING CHECKED CALLED: $typeValue")
55+
typeView.setCheckMarkDrawable(R.drawable.ic_checked)
56+
typeView.isChecked = true
57+
} else {
58+
typeView.checkMarkDrawable = null
59+
typeView.isChecked = false
60+
}
61+
if (listener != null) {
62+
typeView.setOnClickListener {
63+
listener.onClick(typeView.text.toString())
64+
}
65+
}
66+
}
67+
}
68+
}

app/src/main/java/org/fossasia/openevent/general/search/SearchTypeFragment.kt

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,22 @@ import android.view.LayoutInflater
55
import android.view.MenuItem
66
import android.view.View
77
import android.view.ViewGroup
8-
import android.widget.ArrayAdapter
98
import androidx.fragment.app.Fragment
109
import androidx.lifecycle.Observer
1110
import androidx.navigation.NavOptions
1211
import androidx.navigation.Navigation
13-
import kotlinx.android.synthetic.main.fragment_search_type.view.eventTypesLv
12+
import androidx.navigation.fragment.navArgs
13+
import androidx.recyclerview.widget.LinearLayoutManager
14+
import kotlinx.android.synthetic.main.fragment_search_type.view.eventTypesRecyclerView
1415
import org.fossasia.openevent.general.R
1516
import org.fossasia.openevent.general.utils.Utils.setToolbar
1617
import org.fossasia.openevent.general.utils.extensions.nonNull
1718
import org.koin.androidx.viewmodel.ext.android.viewModel
1819

1920
class SearchTypeFragment : Fragment() {
21+
private val typesAdapter: SearchTypeAdapter = SearchTypeAdapter()
2022
private val searchTypeViewModel by viewModel<SearchTypeViewModel>()
23+
private val safeArgs: SearchTypeFragmentArgs by navArgs()
2124
private lateinit var rootView: View
2225
private val eventTypesList: MutableList<String> = arrayListOf("Anything")
2326

@@ -30,21 +33,27 @@ class SearchTypeFragment : Fragment() {
3033
rootView = inflater.inflate(R.layout.fragment_search_type, container, false)
3134
setToolbar(activity, "", hasUpEnabled = true)
3235
setHasOptionsMenu(true)
36+
rootView.eventTypesRecyclerView.layoutManager = LinearLayoutManager(activity)
37+
rootView.eventTypesRecyclerView.adapter = typesAdapter
3338
searchTypeViewModel.loadEventTypes()
34-
val adapter = ArrayAdapter(context, R.layout.event_type_list, eventTypesList)
35-
rootView.eventTypesLv.adapter = adapter
3639

3740
searchTypeViewModel.eventTypes
3841
.nonNull()
3942
.observe(this, Observer { list ->
4043
list.forEach {
4144
eventTypesList.add(it.name)
4245
}
43-
adapter.notifyDataSetChanged()
46+
setCurrentChoice(safeArgs.type)
47+
typesAdapter.addAll(eventTypesList)
48+
typesAdapter.notifyDataSetChanged()
4449
})
45-
rootView.eventTypesLv.setOnItemClickListener { parent, view, position, id ->
46-
redirectToSearch(eventTypesList[position])
50+
51+
val listener: TypeClickListener = object : TypeClickListener {
52+
override fun onClick(chosenType: String) {
53+
redirectToSearch(chosenType)
54+
}
4755
}
56+
typesAdapter.setListener(listener)
4857
return rootView
4958
}
5059

@@ -63,4 +72,13 @@ class SearchTypeFragment : Fragment() {
6372
val navOptions = NavOptions.Builder().setPopUpTo(R.id.eventsFragment, false).build()
6473
Navigation.findNavController(rootView).navigate(R.id.searchFragment, null, navOptions)
6574
}
75+
76+
private fun setCurrentChoice(value: String?) {
77+
for (pos in 0 until eventTypesList.size) {
78+
if (eventTypesList[pos] == value) {
79+
typesAdapter.setCheckTypePosition(pos)
80+
return
81+
}
82+
}
83+
}
6684
}
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<CheckedTextView
3-
android:id="@+id/text1"
3+
android:id="@+id/typeTextView"
44
android:layout_width="match_parent"
55
android:layout_height="wrap_content"
6-
android:paddingStart="@dimen/layout_margin_large"
76
android:paddingTop="@dimen/layout_margin_large"
87
android:paddingBottom="@dimen/layout_margin_large"
98
android:gravity="center_vertical"
109
android:text="@string/anytime"
1110
android:background="?attr/selectableItemBackground"
1211
android:textColor="@color/black"
13-
android:textSize="@dimen/text_size_expanded_title"
14-
android:paddingLeft="@dimen/layout_margin_large"
12+
android:textSize="@dimen/text_size_large"
1513
xmlns:android="http://schemas.android.com/apk/res/android" />

app/src/main/res/layout/fragment_search_type.xml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
android:textSize="@dimen/text_size_extra_large"
2121
android:textStyle="bold" />
2222

23-
<ListView
24-
android:id="@+id/eventTypesLv"
23+
<androidx.recyclerview.widget.RecyclerView
24+
android:id="@+id/eventTypesRecyclerView"
2525
android:layout_width="match_parent"
26-
android:layout_height="wrap_content" />
26+
android:layout_height="wrap_content"
27+
android:divider="@null"
28+
android:scrollbars="none"/>
2729
</LinearLayout>
2830

0 commit comments

Comments
 (0)