Do IT SOPT — Android seminar 4

이승우
SOPT
Published in
8 min readDec 6, 2018

이번 4차 세미나는 유용하게 사용하는 내부 데이터베이스의 종류를 소개하고 그 중에서 SharedPreference가 무엇인지 알아보고 사용해보는 시간을 가지도록 하겠습니다. 이외의 내부 데이터베이스는 추후에 공부하면서 사용해봅시다:)

4차 세미나

  • 내부 데이터베이스 종류
  • SharedPreference
  • About RecyclerView
  • Ripple 효과

내부 데이터베이스의 종류

  1. SharedPreference
  • 간단한 데이터를 읽고 쓰기에 유용
  • Key-Value 쌍으로 데이터를 저장
  • 간단한 값을 데이터를 저장할 때는 데이터베이스보다는 ShraredPreference를 사용하면 편리합니다.
  • 자동 로그인, 앱 초기 설정값, 다시보지 않기 등에 사용됩니다.

2. SQLite

  • Android OS에서 기본적으로 SQLite라는 데이터베이스를 제공, 가장 많이 사용됨.
  • 일반적인 RDBMS 성능보다는 낮지만, 중소 규모의 데이터 양이라면 속도가 괜찮다고 합니다.
  • MySQL 등 RDBMS를 써본 적이 있다면 익히는데 용이합니다.

3. Realm

  • 모바일에 최적화된 내부 데이터베이스 라이브러리
  • 데이터를 객체의 형태로 저장. [쿼리를 이용해 테이블의 칼럼에 값을 저장하는 SQLite와 다름]
  • ORM(Object-relation mapping) 방식이 아닌 데이터 컨테이너 모델을 사용해 객체를 직접 데이터베이스에 저장합니다. 그래서 빠른 속도를 냅니다.
  • SQLite보다 속도가 빠르며, 사용하기에도 편해서 각광을 받습니다.

SharedPreference

SharedPreference에 대해서 앞서 간략한 설명을 했고, 어떻게 사용하는지 살펴보겠습니다.

사용법

  1. Put

Put을 이용해 원하는 데이터를 저장할 수 있습니다.

2. Get

get을 이용하여 원하는 데이터를 Key를 통해 찾아서 꺼낼 수 있습니다.

3. clear

clear를 통하여 USER_NAME으로 된 객체의 모든 정보를 삭제합니다.

이렇게 SharedPreference를 사용하면 간단한 데이터를 저장하여 사용할 수 있고 자동 로그인을 구현할 수 있습니다. 저는 SharedPreference를 Object 즉, Static 하게 만들어서 어디서든 접근할 수 있도록 사용하고 있습니다. 이렇게 구현해야 저장한 값을 어디서든 불러와서 사용할 수 있습니다!

About RecyclerView

앞의 포스팅에서는 RecyclerView가 어떠한 이유 때문에 등장하게 되었는지, 또 ViewHolder 패턴을 강제적으로 사용하고 LayoutManager를 이용해서 아이템의 다양한 배치 방법을 가질 수 있다고 알려드렸는데요.

이번에는 RecyclerView의 아이템에 변동사항이 있을 경우, 어떻게 처리하면 될지에 대해서 살펴보겠습니다. 간단한 예를 들면, 게시판에 글을 쓰고 삭제를 하는 것을 생각해볼 수 있습니다.

4차 실습 코드의 일부를 보면 다음과 같습니다. 아래의 코드는 게시글을 추가하는 코드입니다.

  • notifyItemInserted() : 특정 position에 데이터 하나를 추가하였을 때 호출하면 좋습니다.
  • notifyDataSetChanged() : 데이터 전체가 바뀌었을 때 호출. 즉, 처음부터 끝까지 바뀌었을 때 [사실 이 메소드를 호출하면 다른 메소드는 신경 쓰지 않아도 됩니다. 하지만, 이 메소드는 불필요한 비용을 발생시키므로 사용을 자제하는 것이 좋습니다.]
  • notifyItemRangeInserted() : 특정 범위 포지션에 데이터를 추가했을 때 호출하면 좋습니다. 예를 들면, 3~8번 포지션에 새로운 데이터를 넣은 경우
  • notifyRemoved() : 특정 데이터 하나를 없앴을 때 호출하면 좋습니다.
  • notifyRangeRemoved() : 특정 범위 포지션의 데이터를 없앴을 때 호출하면 좋습니다.
  • notifyItemMoved() : 특정 아이템의 위치를 바꿀 때. 3번 포지션-> 5번 포지션[drag and drop 에 사용됩니다.]
  • notifyItemRangeChanged() : 특정 범위의 포지션이 바뀌었을 때.

다음은 아이템을 삭제하는 경우입니다.

RecyclerView의 아이템 삭제는 item view의 가장 상위 view에 id를 할당하고 viewHolder에서 id를 할당하고 클릭 리스너를 구현해서 아이템의 삭제를 완성할 수 있습니다. [클릭 리스너는 onBindViewHolder에서 구현하면 됩니다.]

추가적인 기능

(1). Ripple Effect

리스트의 항목(item) 터치 시 아무런 애니메이션 효과가 없을 때 Ripple Effect를 적용해 볼 수 있습니다. 이는 안드로이드 Material design의 기본 터치 피드백 애니메이션으로 물결 효과를 의미합니다.

리스트를 구성하는 item view의 root view에 background를 다음과 같이 지정해줍니다.

// 기본적인 제한된 물결 효과
android:background = "?android:selectableItemBackground"
// 뷰를 넘어 확장되는 물결 효과
android:background = "?android:selectableItemBackgroundBorderless"

위의 두 가지 옵션은 미리 정의되어 있는 것이고 커스터마이징이 가능하니 검색을 통해서 더 알아보고 사용하면 됩니다. ^.^

(2). NestedScrollView

이는 말 그대로 중첩 스크롤뷰입니다. 사용되는 한가지 예는 화면에 리싸이클러뷰가 있는데 Header를 구현해야 할 경우, Header를 구현하는 것이 조금 복잡하다면 NestedScrollView를 이용해서 해결할 수 있습니다.

RecyclerView Header?

RecyclerView는 동일한 아이템이 반복되는 경우에 사용됩니다. 하지만, 상단에 광고나 이미지와 같은 다른 형태의 아이템이 들어올 경우에는 viewType에 따른 Header를 구현할 수 있습니다. Header가 있다면 Footer도 있겠죠? 이는 검색하면 많은 내용이 나오니 공부하면 도움이 될 겁니다.:)

NestedScrollView를 이용하면 RecyclerView와 그 위의 View도 같이 스크롤이 가능합니다. 구성을 어떻게 하는지는 아래의 XML을 참고해주세요!

NesteScrollView 사용 예.

위처럼 NestedScrollView 안에는 하나의 상위 Layout이 존재해야 합니다. [ScrollView도 마찬가지입니다.]보통은 LinearLayout을 많이 사용합니다. 그리구 위의 코드는 RecyclerView가 있구 Footer로 ImageView가 있는데, ImageView가 위에 있고 RecyclerView가 아래에 있다면 Header가 되겠죠??

그리고 RecyclerView에 nestedScrollingEnabled = false라는 옵션을 줍니다. 그러면 스크롤뷰 안에 있는 RecyclerView가 부드럽게 동작할 것입니다.

(3).SwipeRefreshLayout

안드로이드 앱을 사용하다 보면 당겨서 새로고침을 하는 UI를 본 적이 많죠? 많이 접한 당겨서 새로고침을 구현해보겠습니다. 정말 간단합니다:)

당겨서 새로고침은 SwipeRefreshLayout을 사용합니다. 새로고침을 적용한 뷰를 SwipeRefreshLayout으로 감싸줍니다. 그리고 코드상으로 setOnRefreshListener를 등록해줍니다.

refreshLayout.setOnRefreshListener{
// 이 리스너는 사용자가 화면을 끝까지 당겼다가 놓았을 때 동작합니다.
// 이곳에 서버 재통신 로직을 넣어주면 됩니다.
// 그리고 로직 처리가 완료되면 isRefreshing = false를 해줍니다.
refreshLayout.isRefreshing = false
// false를 주지 않으면 새로고침 아이콘이 사라지지 않습니다..ㅎ
}

setColorSchemaResources 메소드를 이용해 아래와 같이 새로고침 아이콘에 색상을 지정할 수도 있습니다.

refreshLayout.setColorSchemeResources(
android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light
);

화살표가 한바퀴 돌 때마다 색상이 바뀌어서 나타납니다.

--

--