Android ViewPager2 + TabView JAVA
2020. 6. 11. 10:02ㆍAndroid
반응형
0. Gradle 셋팅
밑에 3개 추가
implementation 'androidx.viewpager2:viewpager2:1.1.0-alpha01'
implementation 'com.android.support:design:28.0.0'
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha04' //뷰페이저 2
1.TabListActivity셋팅
public class TabListActivity extends AppCompatActivity {
ViewPager2 viewPager2; //뷰페이저
ViewPagerAdapter viewPagerAdapter; //뷰페이저 어뎁터
TabLayout tabLayout; //텝 레이아웃
ArrayList <Data_Type>mdata; //데이터 모델
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab_list);
context = this;
mdata = new ArrayList<>();
viewPager2 = findViewById(R.id.notification_list_container);
tabLayout = findViewById(R.id.notification_list_tabs);
// tabLayout.addTab(tabLayout.newTab().setText("A")); //텝 레이아웃 아이템 추가
// tabLayout.addTab(tabLayout.newTab().setText("B"));
// tabLayout.addTab(tabLayout.newTab().setText("C"));
mdata.add(new Data_Type(1));
mdata.add(new Data_Type(2));
mdata.add(new Data_Type(3));
viewPagerAdapter = new ViewPagerAdapter(context ,mdata); //뷰페이저 어뎁터 생성
viewPager2.setAdapter(viewPagerAdapter);//어뎁터 연결
viewPager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL); //스크롤방향
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(tabLayout, viewPager2, true, new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {// 텝 레이아웃이랑 연결
switch (position){
case 0:{
tab.setText("A"); //텝레이아웃 상단 타이틀 제목 설정
break;
}
case 1:{
tab.setText("B");
break;
}
case 2:{
tab.setText("C");
break;
}
}
}
});
tabLayoutMediator.attach();
viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { //뷰페이저 해당 포지션 위치
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
switch (position){
case 0://A
{
Toast.makeText(context, "A", Toast.LENGTH_SHORT).show();
break;
}
case 1://B
{
Toast.makeText(context, "B", Toast.LENGTH_SHORT).show();
break;
}
case 2://C
{
Toast.makeText(context, "C", Toast.LENGTH_SHORT).show();
break;
}
}
}
});
}
}
2.TabListActivity xml 셋팅
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.tabs.TabLayout
android:id="@+id/notification_list_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00ffff"
app:tabSelectedTextColor="#000000"
app:tabTextColor="#bbbbbb"
app:tabIndicatorColor="#FF0000"
app:tabGravity="fill"
app:tabMode="fixed"
app:tabIndicatorHeight="2dp">
</com.google.android.material.tabs.TabLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/notification_list_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f2f2f2"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</androidx.viewpager2.widget.ViewPager2>
</LinearLayout>
3.Data_Type Model 셋팅
public class Data_Type { // 타입으로 페이지 나눔
int type;
public Data_Type(int type) {
this.type = type;
}
public int getType() {
return type;
}
}
4.ViewPagerAdapter 셋팅
public class ViewPagerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Context context;
LayoutInflater inflater;
ArrayList<Data_Type> mdata; //데이터 모델 받아오기
ViewPagerAdapter(Context context, ArrayList<Data_Type> mdata) {
this.context = context;
this.mdata = mdata;
inflater = LayoutInflater.from(context);
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
switch (viewType) { //viewType = getItemViewType 지정해준 Data_Type 에 type
case 1: { // A 뷰홀더
View view = inflater.inflate(R.layout.type_a, parent, false);
return new A_ViewHolder(view,viewType);
}
case 2:{// B 뷰홀더
View view = inflater.inflate(R.layout.type_b, parent, false);
return new B_ViewHolder(view,viewType);
}
case 3:{// C 뷰홀더
View view = inflater.inflate(R.layout.type_c, parent, false);
return new C_ViewHolder(view,viewType);
}
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return mdata.size();
}
@Override
public int getItemViewType(int position) {
switch (mdata.get(position).getType()){ //데이터 모델에서 Type 을 받아들여 ItemViewType으로 씀
case 1: // A
return 1;
case 2: // B
return 2;
case 3:// C
return 3;
}
return 1;
}
}
5. ViewHolder 셋팅
A뷰홀더랑 똑같이 B ,C 뷰홀더를 생성
public class A_ViewHolder extends RecyclerView.ViewHolder {
int a;
TextView textView;
public A_ViewHolder(@NonNull View itemView , int a ) { //뷰홀더에서 작업들 실행
super(itemView);
this.a = a;
textView = itemView.findViewById(R.id.a_textview);
textView.setText(String.valueOf(a));
}
}
6. ViewHolder Item xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary">
<TextView
android:id="@+id/a_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
완성본
정말 간단하게 만들어본 ViewPager 2 와 TabLayout 입니다
ViewPager2 페이지에서의 작업들은 ViewHolder 에서 작업하시면 됩니다
ViewPager2 가 코틀린 소스들은 많은데 자바 소스들은 많이 없어서 정리해서 올립니다.
반응형
'Android' 카테고리의 다른 글
Android 이미지 해상도별 자동 비율 구하기 (0) | 2020.06.29 |
---|---|
[안드로이드] 각 프래그먼트 별 뒤로가기 버튼(백버튼) 이벤트 (뷰페이저 사용) (0) | 2020.06.15 |
Android Recyclerview Checkbox position Check 유지 (0) | 2020.06.08 |
Android SwipeLayout (옆으로 밀기 레이아웃) (0) | 2020.06.02 |
Android 애니메이션(translation) (0) | 2020.05.25 |