Skip to content

rkdmf1026/RepositorySearchApp

Repository files navigation

RepositorySearchApp

프로젝트 소개

GitHub API를 사용하여 GitHub Repository를 조회하고 리스틀 보여주는 어플리케이션

Preview

preview.mp4

주요 기능

Repository 검색기능

Repository를 검색하여 관련 Repository 리스트를 표시

페이징 기능

한번에 10개의 Repository를 보여주고 스크롤 할 경우 다음 Repository 리스트를 표시 

코드 설명

Retrofit2 & okhttp setting

carbon (16) Http Log를 확인하기 위해 HttpLoggingInterceptor 객체를 생성하고 lvele을 설정한 후 OkhttpClient의 addIntercepter 메서드를 사용하여 호출한다. Retrofitdpsms GsonConverter를 사용하였고, Object 키워드를 사용하여 싱글턴으로 만들었으며, lazy를 통해서 사용되는 순간에 만들어지게 구현하였다.

API && DTO Class

carbon (1) GitHub API의 응답 데이터 구조에 맞게 DTO Class를 구현하였다.

carbon API 통신을 위한 인터페이스를 정의하였다. 코루틴 스코프 안에서 사용하기 위해 suspend 함수로 선언하였다.

MVVM Architecture

carbon (2) 먼저 data binding을 사용하기 위해 main.xml 리소스를 태그를 적용한다.그리고 태그 안에 사용할 variable인 MainViewModel을 선언한다.

carbon (7) Repository 리스트의 데이터를 처리할 _itemList를 private으로 선언하고, 외부에서 observe 하기 위한 itemList를 getter로 받습니다.

carbon (15) ViewModel을 생성하고, ViewModel에서 getter로 설정한 itemList를 관찰하여 변화가 있을때마다 어댑터의 리스트를 갱신하도록 구현합니다.

List Adapter

carbon (8) DiffUtil을 사용하여 ListAdapter를 구현함으로써 AsyncListDiffer 객체 없이도 백그라운드 스레드에서 DiffUtil 작업을 수행하고, 별도의 submitList 메서드를 구현하지 않고 사용할 수 있다.

carbon (9) 이후에 설명할 페이징 기능을 구현하기 위해 멀티 뷰홀더를 사용하였다. repository의 정보를 담는 GitHubViewHolder와 페이징 기능에서 쓰일 Progressbar가 있는 LoadingViewHolder로 나눠 구현하였다. (GitHubViewHolder의 item은 databinding을 LoadingViewHolder의 item은 viewBinding을 사용하였다.)

carbon (11) Repository의 정보가 비워져 있는 Loading Item은 Type_Loading으로 repository 정보가 있는 Item들은 TYPE_ITEM으로 뷰타입이 정해지고, 뷰타입에 따라 각각 LoadingViewHolder, GitHubVieHolder로 만들어진다.

페이징 기능

carbon (12) Repository 클래스에서는 입력받은 repository 이름과 page의 순서, 그동안 받은 repository의 list를 저장한다. 입력된 repository의 이름이 같고, type이 PAGING 상수와 같을 경우 page의 순서를 1 늘린다. 아닐 경우에는 새로운 repository를 입력받았다고 판단하여 모든 변수를 초기화한다. 그렇게 설정된 변수들을 통해 api를 호출하고 받은 list를 itemList에 추가하여 리턴한다.

carbon (7) ViewModel의 serachItem 메서드는 단순 검색인지, 페이징인지에 대한 type을 인자로 받아 Repository 클래스의 함수를 실행하여 itemList를 갱신한다.

carbon (15) Activity에서는 ViewHodel의 itemList를 관찰하다가 변화가 생기면 itemList에 추가적으로 비워져있는 item(LoadingItem)을 넣고 어댑터의 submitList 메서드를 실행한다.

carbon (13) BindingAdapter를 사용하여 RecyclerView에 viewModel를 넘겨 페이징을 구현하였다. 아이템의 최하단이 완전히 보이는 가장 밑의 아이템의 position인 lastItemPosition과 실제 item의 갯수인 itemCount(-1)를 비교하여 같고, itemType이 TYPE_LOADGIN일 경우 아래의 deleteLastItem()을 호출하고 viewModel의 searchItem 메서드에 PAGING 상수를 인자로 넣어 실행한다.

carbon (10) GitHubAdapter 안에 구현되어 있는 deleteLastItem은 LoadingItem을 삭제하기 위해 구현하였다. 현재 List를 복사하고 마지막 item을 삭제한 후 다시 submitList 메서드를 사용하여 리스트를 갱신한다.

이외의 기능들

[키보드 내리기] carbon (14) 키보드의 엔터버튼 클릭 시 키보드가 내려가고 viewModel의 searchItem 메서드가 실행될 수 있도록 BindingAdapter로 구현하였다. getSystemService를 사용하기 위해 context를 받아 구현하였다.

[main.xml] carbon (3) EditText에 입력된 값을 viewModel에서도 사용하기 위해 양방향 데이터바인딩으로 구현하였다.(바인딩어댑터의 속성도 사용하였다.) 위에서 언급하였던 키보드 내리기 기능을 사용하기 위해 imeOptions를 actionDone으로 설정하였다.

carbon (4) EditText 위에 있는 ImagView로 클릭 시 viewModel의 searchItem이 실행하도록 구현하였다.

carbon (5) 구현한 바인딩어댑터의 속성을 사용하였다.

[item_repository.xml] carbon (6) Repository의 정보를 담는 item에서 이름을 표시하는 TextView에 이름이 1줄을 초과할 경우 흐르는 효과를 주기 위해 marquee 효과와 지금은 deprecated된 singleLine을 사용하여 구현하였다.(databinding을 통해 구현하였다.)

[GitHubViewHolder] carbon ViewHolder에서 bind할 때, databinding된 item에 값을 넣어주고, image의 경우에는 Glide를 통해 로드하도록 구현하였다. isSelected를 true로 한 것은 marguee 효과를 주기 위해 설정하였다.

Specification

Architecture MVVM
Jetpack Components DataBinding, LiveData, ViewModel
Other Libraries Glide
Network OkHttp, Retrofit2, coroutine
minSdk/targetSdk 23/31

Package Structure

* 📦repositorysearchapp
        ├─📂main
        ├─📂network
        │  ├─📂api
        │  ├─📂dto
        │  └─📂repository
        └─📂util

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages