본문

재생 리스트

도입

이번 포스팅에서는 `재생 리스트 기능`을 구현할 예정이다. 구현하기 위해서는 아래 2가지 기능이 필요하고 이 포스팅에서는

  1. Media List 순서 변경
  2. Media List 순서 저장

에 대해 정리할 예정이다.


현재 상황

미디어 플레이어에서는 별도의 화면으로 재생 리스트를 제공하지는 않을 예정이다. 
(별도의 화면이 생기면 Dept가 1개 더 생기므로)

그래서 재생 리스트는

  1. 현재 리스트 화면
  2. 나만의 앨범

2가지 방법으로 지원할 예정이다.


추가 사항

  1. Media List의 순서 변경 (현재 리스트 화면에서 다이렉트로 순서 변경)
  2. Media List 순서 저장 (앱이 재실행되더라도 순서를 유지)
    sharedPreference 사용

구현

1. 순서 변경

https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper

ItemTouchHelper의 callback을 통해 기능을 구현할 예정이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Only support Up or Down action 
object : SimpleCallback(UP or DOWN, ACTION_STATE_IDLE) {
    override fun onMove(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder
    ): Boolean {
        val adapter = recyclerView.adapter
        val from = viewHolder.adapterPosition
        val to = target.adapterPosition
 
        // Create the swapped new list
        val newList = adapter.currentList.toMutableList().apply {
            swap(from, to)
        }
        // ...
        // Update the adapter
        adapter.submitList(newList)
        return true
    }
 
    // Not support the swipedAction (Left, Right)
    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) = Unit
    override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
        super.onSelectedChanged(viewHolder, actionState)
        if (actionState == ACTION_STATE_DRAG) {
            viewHolder?.itemView?.alpha = 0.5f
        }
    }
 
    override fun clearView(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder
    ) {
        super.clearView(recyclerView, viewHolder)
        viewHolder.itemView.alpha = 1.0f
        recyclerView.adapter.notifyDataSetChanged()
    }
 
}
cs

2. 순서 저장

※ 주의 사항
앱 재실행 시, media가 추가/삭제된 경우 최신 List를 기반으로 List를 만들어야 한다.

구현방법

step1. 기존 MediaList 로드 - sharedPreference
step2. 현재 Media List와 공통 부분으로 Media List 생성 (삭제 케이스)
step3. 새로운 Media List는 뒤에 추가 (추가 케이스)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Step1. get prefsMediaList from sharedPreference
val prefsMediaList = SharedPreferenceUtil.getPlayListIds(context, mediaListType)
 
if (prefsMediaList != null) {
    val intersectedList = mutableListOf<Media>()
    // Step2. get intersected list
    prefsMediaList.forEach { prefsMediaId ->
        newMediaList.find { newMedia -> newMedia.id == prefsMediaId }?.let {
            intersectedList.add(it)
        }
    }
 
    // Step3. intersectedList union newMediaList
    intersectedList.union(newMediaList).toList()
else {
    newMediaList
}
cs

스크린 샷

AS-IS TO-BE

 

 

#앱개발 #모바일앱개발 #어플개발

공유

댓글