Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
AloqaIM-Android
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
AloqaIM-Android
Commits
844403b9
Commit
844403b9
authored
Mar 14, 2018
by
Shailesh Baldaniya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: Add section adapter
parent
0833e3d0
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
193 additions
and
3 deletions
+193
-3
ChatRoomsFragment.kt
...ava/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
+27
-3
SimpleSectionedRecyclerViewAdapter.kt
...ndroid/chatrooms/ui/SimpleSectionedRecyclerViewAdapter.kt
+151
-0
item_chatroom_header.xml
app/src/main/res/layout/item_chatroom_header.xml
+14
-0
strings.xml
app/src/main/res/values/strings.xml
+1
-0
No files found.
app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
View file @
844403b9
...
...
@@ -47,6 +47,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
private
val
handler
=
Handler
()
private
var
listJob
:
Job
?
=
null
private
val
sectionedAdapter
:
SimpleSectionedRecyclerViewAdapter
?
=
null
companion
object
{
fun
newInstance
()
=
ChatRoomsFragment
()
...
...
@@ -147,15 +148,16 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
activity
?.
apply
{
listJob
?.
cancel
()
listJob
=
launch
(
UI
)
{
val
adapter
=
recycler_view
.
adapter
as
ChatRoomsAdapter
setSections
()
val
adapter
=
recycler_view
.
adapter
as
SimpleSectionedRecyclerViewAdapter
// FIXME https://fabric.io/rocketchat3/android/apps/chat.rocket.android.dev/issues/5a90d4718cb3c2fa63b3f557?time=last-seven-days
// TODO - fix this bug to reenable DiffUtil
val
diff
=
async
(
CommonPool
)
{
DiffUtil
.
calculateDiff
(
RoomsDiffCallback
(
adapter
.
dataSet
,
newDataSet
))
DiffUtil
.
calculateDiff
(
RoomsDiffCallback
(
adapter
.
baseAdapter
.
dataSet
,
newDataSet
))
}.
await
()
if
(
isActive
)
{
adapter
.
updateRooms
(
newDataSet
)
adapter
.
baseAdapter
.
updateRooms
(
newDataSet
)
diff
.
dispatchUpdatesTo
(
adapter
)
}
}
...
...
@@ -218,14 +220,36 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
resources
.
getDimensionPixelSize
(
R
.
dimen
.
divider_item_decorator_bound_end
)))
recycler_view
.
itemAnimator
=
DefaultItemAnimator
()
// TODO - use a ViewModel Mapper instead of using settings on the adapter
val
baseAdapter
=
ChatRoomsAdapter
(
this
,
settingsRepository
.
get
(
serverInteractor
.
get
()
!!
))
{
chatRoom
->
recycler_view
.
adapter
=
ChatRoomsAdapter
(
this
,
settingsRepository
.
get
(
serverInteractor
.
get
()
!!
),
localRepository
)
{
chatRoom
->
presenter
.
loadChatRoom
(
chatRoom
)
}
//Add your adapter to the sectionAdapter
val
mSectionedAdapter
=
SimpleSectionedRecyclerViewAdapter
(
this
,
R
.
layout
.
item_chatroom_header
,
R
.
id
.
text_chatroom_header
,
baseAdapter
)
//Apply this adapter to the RecyclerView
recycler_view
.
adapter
=
mSectionedAdapter
}
}
private
fun
setSections
(){
//This is the code to provide a sectioned list
val
sections
=
ArrayList
<
SimpleSectionedRecyclerViewAdapter
.
Section
>()
//Sections
sections
.
add
(
SimpleSectionedRecyclerViewAdapter
.
Section
(
0
,
"Section 1"
))
sections
.
add
(
SimpleSectionedRecyclerViewAdapter
.
Section
(
2
,
"Section 2"
))
sections
.
add
(
SimpleSectionedRecyclerViewAdapter
.
Section
(
5
,
"Section 3"
))
val
dummy
=
arrayOfNulls
<
SimpleSectionedRecyclerViewAdapter
.
Section
>(
sections
.
size
)
sectionedAdapter
?.
setSections
(
sections
.
toArray
(
dummy
))
}
private
fun
queryChatRoomsByName
(
name
:
String
?):
Boolean
{
presenter
.
chatRoomsByName
(
name
?:
""
)
return
true
...
...
app/src/main/java/chat/rocket/android/chatrooms/ui/SimpleSectionedRecyclerViewAdapter.kt
0 → 100644
View file @
844403b9
package
chat.rocket.android.chatrooms.ui
import
android.content.Context
import
android.support.v7.widget.RecyclerView
import
android.util.SparseArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.TextView
import
java.util.*
class
SimpleSectionedRecyclerViewAdapter
(
private
val
context
:
Context
,
private
val
sectionResourceId
:
Int
,
private
val
textResourceId
:
Int
,
val
baseAdapter
:
ChatRoomsAdapter
)
:
RecyclerView
.
Adapter
<
RecyclerView
.
ViewHolder
>()
{
private
var
isValid
=
true
private
val
layoutInflater
:
LayoutInflater
=
context
.
getSystemService
(
Context
.
LAYOUT_INFLATER_SERVICE
)
as
LayoutInflater
private
val
sectionsHeaders
=
SparseArray
<
Section
>()
init
{
baseAdapter
.
registerAdapterDataObserver
(
object
:
RecyclerView
.
AdapterDataObserver
()
{
override
fun
onChanged
()
{
isValid
=
baseAdapter
.
itemCount
>
0
notifyDataSetChanged
()
}
override
fun
onItemRangeChanged
(
positionStart
:
Int
,
itemCount
:
Int
)
{
isValid
=
baseAdapter
.
itemCount
>
0
notifyItemRangeChanged
(
positionStart
,
itemCount
)
}
override
fun
onItemRangeInserted
(
positionStart
:
Int
,
itemCount
:
Int
)
{
isValid
=
baseAdapter
.
itemCount
>
0
notifyItemRangeInserted
(
positionStart
,
itemCount
)
}
override
fun
onItemRangeRemoved
(
positionStart
:
Int
,
itemCount
:
Int
)
{
isValid
=
baseAdapter
.
itemCount
>
0
notifyItemRangeRemoved
(
positionStart
,
itemCount
)
}
})
}
class
SectionViewHolder
(
view
:
View
,
mTextResourceid
:
Int
)
:
RecyclerView
.
ViewHolder
(
view
)
{
var
title
:
TextView
=
view
.
findViewById
<
View
>(
mTextResourceid
)
as
TextView
}
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
typeView
:
Int
):
RecyclerView
.
ViewHolder
{
return
if
(
typeView
==
SECTION_TYPE
)
{
val
view
=
LayoutInflater
.
from
(
context
).
inflate
(
sectionResourceId
,
parent
,
false
)
SectionViewHolder
(
view
,
textResourceId
)
}
else
{
baseAdapter
.
onCreateViewHolder
(
parent
,
typeView
-
1
)
}
}
override
fun
onBindViewHolder
(
viewHolder
:
RecyclerView
.
ViewHolder
,
position
:
Int
)
{
if
(
isSectionHeaderPosition
(
position
))
{
(
viewHolder
as
SectionViewHolder
).
title
.
text
=
sectionsHeaders
.
get
(
position
).
title
}
else
{
baseAdapter
.
onBindViewHolder
(
viewHolder
as
ChatRoomsAdapter
.
ViewHolder
,
sectionedPositionToPosition
(
position
))
}
}
override
fun
getItemViewType
(
position
:
Int
):
Int
{
return
if
(
isSectionHeaderPosition
(
position
))
SECTION_TYPE
else
baseAdapter
.
getItemViewType
(
sectionedPositionToPosition
(
position
))
+
1
}
class
Section
(
internal
var
firstPosition
:
Int
,
title
:
CharSequence
)
{
internal
var
sectionedPosition
:
Int
=
0
var
title
:
CharSequence
internal
set
init
{
this
.
title
=
title
}
}
fun
setSections
(
sections
:
Array
<
Section
>)
{
sectionsHeaders
.
clear
()
Arrays
.
sort
(
sections
)
{
o
,
o1
->
when
{
o
.
firstPosition
==
o1
.
firstPosition
->
0
o
.
firstPosition
<
o1
.
firstPosition
->
-
1
else
->
1
}
}
for
((
offset
,
section
)
in
sections
.
withIndex
())
{
section
.
sectionedPosition
=
section
.
firstPosition
+
offset
sectionsHeaders
.
append
(
section
.
sectionedPosition
,
section
)
}
notifyDataSetChanged
()
}
fun
positionToSectionedPosition
(
position
:
Int
):
Int
{
var
offset
=
0
for
(
i
in
0
until
sectionsHeaders
.
size
())
{
if
(
sectionsHeaders
.
valueAt
(
i
).
firstPosition
>
position
)
{
break
}
++
offset
}
return
position
+
offset
}
private
fun
sectionedPositionToPosition
(
sectionedPosition
:
Int
):
Int
{
if
(
isSectionHeaderPosition
(
sectionedPosition
))
{
return
RecyclerView
.
NO_POSITION
}
var
offset
=
0
for
(
i
in
0
until
sectionsHeaders
.
size
())
{
if
(
sectionsHeaders
.
valueAt
(
i
).
sectionedPosition
>
sectionedPosition
)
{
break
}
--
offset
}
return
sectionedPosition
+
offset
}
private
fun
isSectionHeaderPosition
(
position
:
Int
):
Boolean
{
return
sectionsHeaders
.
get
(
position
)
!=
null
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
when
(
isSectionHeaderPosition
(
position
))
{
true
->
(
Integer
.
MAX_VALUE
-
sectionsHeaders
.
indexOfKey
(
position
)).
toLong
()
false
->
baseAdapter
.
getItemId
(
sectionedPositionToPosition
(
position
))
}
}
override
fun
getItemCount
():
Int
{
return
if
(
isValid
)
baseAdapter
.
itemCount
+
sectionsHeaders
.
size
()
else
0
}
companion
object
{
private
const
val
SECTION_TYPE
=
0
}
}
app/src/main/res/layout/item_chatroom_header.xml
0 → 100644
View file @
844403b9
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<TextView
android:id=
"@+id/text_chatroom_header"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:padding=
"4dp"
android:text=
"@string/chatroom_header"
android:textSize=
"18sp"
/>
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
app/src/main/res/values/strings.xml
View file @
844403b9
...
...
@@ -158,4 +158,5 @@
<string
name=
"dialog_sort_by_activity"
>
Activity
</string>
<string
name=
"dialog_group_by_type"
>
Group by type
</string>
<string
name=
"dialog_group_favourites"
>
Group favourites
</string>
<string
name=
"chatroom_header"
>
Header
</string>
</resources>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment