본문

[2017.11.29] 79. Android 음악 플레이어 프로젝트 [데이터정렬]

도입

이번 포스팅에서는 미루고 미뤘던 음악 플레이어의 Tab 설정에 따른 데이터 정렬을 설정할 예정이다.


문제점 

데이터의 흐름은 정해졌고 데이터는 흐르고 있다. 그래서 Tab 설정에 따른 데이터 정렬은 쉬울 줄 알았다. 

현재 코드는 데이터를 요청할 때 

1) BaseActivity에서 MusicDataController를 통해 데이터를 로드

2) ListActivity에 보여주고

3) 해당 리스트를 바탕으로 PlayMainViewActivity에서 음악을 플레이하도록 요청

한다.

 

하지만!! 데이터 정렬을 하기 위해서는 데이터 호출부터 데이터 전달과 관련된 모든 클래스에 매개변수를 추가해야한다.

결국 MusicDataController, BaseActivity, ListActivity, PlayMainViewActivity의 코드를 모두 수정해야한다.

 

유지보수 측면에서 기능 하나 추가만으로 이렇게 많이 코드가 변경되는 것은 설계가 잘못되었다고 생각한다....(처음부터 데이터 정렬을 생각하지 않은 것도 큰 잘못이다...)

 

그래서 코드를 변경했다. MusicDataController를 대표로 보면

변경 전

변경 후

1
2
3
4
5
6
7
public class MusicDataController {
    // ...
    public List<Music> getList(){
        return list;
    }
    // ...
}
cs
 
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
public class MusicDataController {
    // ...
    public List<Music> getList(String standard){
        switch (standard) {
        case Const.SORT_MUSIC_BY_TITLE:
            Collections.sort(list,
                      (o1, o2) -> 
                     o1.getTitle().compareTo(o2.getTitle()));
            break;
        case Const.SORT_MUSIC_BY_ARTIST:
            Collections.sort(list,
                      (o1, o2) -> 
                     o1.getArtist().compareTo(o2.getArtist()));
            break;
        case Const.SORT_MUSIC_BY_GENRE:
            Collections.sort(list,
                      (o1, o2) -> 
                     o1.getGenre().compareTo(o2.getGenre()));
            break;
        case Const.SORT_MUSIC_BY_ALBUM:
            Collections.sort(list, 
                      (o1, o2) -> 
                     o1.getAlbumId().compareTo(o2.getAlbumId()));
            break;
        }
 
        return list;
    }
    // ...
}

 

그러나 다른 문제점은!!

정렬이 Tab에 따라 변경되지만 제대로 동작하지 않는다. 아래 움짤과 같이 다음 데이터가 현재보이고 탭을 변경하다보면 데이터가 변경된다.


해결책

그래서 코드를 보며 오래 생각한 결과, 

원인은 모든 Tab이 1개의 List를 바라보고 있기 때문이었다.

FragmentStatePagerAdapter에서 현재 Tab과 양 옆의 Tab의 데이터를 미리 로드한다. 그래서 데이터를 로드할 때 getList 메소드가 동시에 호출되기 때문이다. 그림으로 확인하면,

문제점

해결책

 

그래서 코드를 다음과 같이 변경했다.

변경 전

변경 후

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
public class MusicDataController {
    // ...
    public List<Music> getList(String standard){
        switch (standard) {
        case Const.SORT_MUSIC_BY_TITLE:
            Collections.sort(list,
                (o1, o2) -> 
                o1.getTitle().compareTo
                                (o2.getTitle()));
            break;
        case Const.SORT_MUSIC_BY_ARTIST:
            Collections.sort(list,
                (o1, o2) -> 
                o1.getArtist().compareTo
                                (o2.getArtist()));
            break;
        case Const.SORT_MUSIC_BY_GENRE:
            Collections.sort(list,
                (o1, o2) -> 
                o1.getGenre().compareTo
                                (o2.getGenre()));
            break;
        case Const.SORT_MUSIC_BY_ALBUM:
            Collections.sort(list, 
                (o1, o2) -> 
                o1.getAlbumId().compareTo
                                (o2.getAlbumId()));
            break;
        }
 
        return list;
    }
    // ...
}
cs
 
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
public class MusicDataController {
    // ...
    public List<Music> getList(String standard){
        // 데이터 복사해 정렬 후 반환
        for (Music item : list) {
            result.add(item);
        }
 
        switch (standard) {
            case Const.SORT_MUSIC_BY_TITLE:
                Collections.sort(result,
                    (o1, o2) -> 
                    o1.getTitle().compareTo
                            (o2.getTitle()));
                break;
            case Const.SORT_MUSIC_BY_ARTIST:
                Collections.sort(result,
                    (o1, o2) -> 
                    o1.getArtist().compareTo
                            (o2.getArtist()));
                break;
            case Const.SORT_MUSIC_BY_GENRE:
                Collections.sort(result,
                    (o1, o2) -> 
                    o1.getGenre().compareTo
                            (o2.getGenre()));
                break;
            case Const.SORT_MUSIC_BY_ALBUM:
                Collections.sort(result, 
                    (o1, o2) -> 
                    o1.getAlbumId().compareTo
                    (o2.getAlbumId()));
                break;
        }
 
        return result;    
    }
    // ...
}
cs


스크린 샷

다음과 같이 문제 해결!

 

 

#안드로이드 음악 플레이어 #안드로이드 mp3 #안드로이드 프로젝트  #앱개발 #모바일앱개발 #어플개발

공유

댓글