[안드로이드] Viewpager와 indicator를 한번에 !!

[안드로이드] Viewpager와 indicator를 한번에 !!

우리는 간단하게 이미지를 나열하기 위하여 Viewpager를 사용합니다.

그렇다면 인스타그램처럼 여러 사진을 게시물로 게시할 때 아래와 같이 viewpager와 indicator를 함께 사용하기 위해서는 어떻게 해야 할까요?? (실제로는 react로 구현된 다른 라이브러리일 것입니다. 안드로이드의 예시..!)

인스타그램 게시물 예시

아마 ViewPager를 만들고 indicator라이브러리를 사용하여 둘 사이의 listener 또는 callback을 달아줘야 할 입니다. 이러한 과정을 간소화한다면 어떨까라는 생각과 함께 viewpager와 indicator를 한 번에 생성할 수 있는 라이브러리를 만들게 되었습니다.

라이브러리의 이름은 SIViewPager..!

build.gradle에서 의존성만 추가하면 바로 사용하실 수 있습니다.

implementation 'com.myhome.siviewpager:siviewpager:1.0.1'

SIViewpager를 사용하기 위해서는 viewpager with indicator가 들어가고자 하는 레이아웃 xml에서 크기와 위치 등을 지정한 뒤 코드 단에서 SIPagerAdapter를 상속받은 커스텀 어댑터와 연결해주기만 하면 됩니다. 여기서 주의할 점은 커스텀 어댑터에서 instantiateItem메서드를 오버라이드 해야 동작한다는 점입니다.

package com.myhome.viewpagersample import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.myhome.siviewpager.SIViewPager import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { var index = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val siViewpager = findViewById(R.id.siviewpager) val siPagerAdapter = MyPagerAdapter(applicationContext) siPagerAdapter.addItem(R.drawable.ic_android_black_24dp) siPagerAdapter.addItem(R.drawable.ic_assignment_black_24dp) siViewpager.build(siPagerAdapter) add_bt.setOnClickListener { if(index % 2 == 0){ siPagerAdapter.addItem(R.drawable.ic_android_black_24dp) } else{ siPagerAdapter.addItem(R.drawable.ic_assignment_black_24dp) } index++ } } }

package com.myhome.viewpagersample import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import com.myhome.siviewpager.SIPagerAdapter import kotlinx.android.synthetic.main.pager_item.view.* class MyPagerAdapter(context:Context): SIPagerAdapter() { val context = context override fun instantiateItem(container: ViewGroup, position: Int): Any { val view = LayoutInflater.from(context).inflate(R.layout.pager_item, container, false) view.my_image.setImageResource(items.get(position) as Int) view.setTag(position) container.addView(view) view.remove_bt.setOnClickListener { removeAt(position) } return view } }

위의 예제에서는 이미지의 리소스인 Int값을 SIPAgerAdapter의 items에 삽입하였지만 items필드는 Any객체로 지정되어 있기 때문에 커스텀한 객체를 사용할 수도 있습니다. 여기서 view에 setTag를 하는 이유는 viewpager에서 item의 이동을 감지하거나 추가, 삭제가 될 경우 view에 접근하기 위한 position이 필요하기 때문입니다.(필수로 작성해야합니다)

위의 예제는 간단하게 viewpager를 만들고 새로운 이미지를 추가/제거하는 예제입니다. 라이브러리를 사용하시면서 문제가 발생한다면 피드백 주시면 정말 정말 감사드리겠습니다!!

전체 예제 코드 -> https://github.com/godsangin/SIViewPagerSample

SIViewPager -> https://github.com/godsangin/SIViewPager

from http://in-idea.tistory.com/31 by ccl(A) rewrite - 2020-03-17 18:54:38

댓글

이 블로그의 인기 게시물

[React] - 18) 프로젝트 빌드하기(+코드 스플리팅)

입트영(2020.03.23) - Iced Drinks / 아이스 음료

Redux + React