ViewPager2 + TabLayout + Fragment打造精美布局


前言

当你想要一个精美的视图集就像下面这样


提示:以下是本篇文章正文内容,下面案例可供参考

一、ViewPager2 + TabLayout + Fragment

在这里插入图片描述

材料

  1. TabLayout
  2. ViewPager2
  3. Fragment

核心代码

 public void initView(){

        OkHttpUtils.getCall("http://124.93.196.45:10002"+"/system/dict/data/type/press_category").enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d("TAG", "onFailure: "+e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                KindBean kindBean= new Gson().fromJson(response.body().string(),KindBean.class);

                for (int i = 0; i < kindBean.getData().size(); i++) {
                //实例化Fragment对象存入数组
                    list.add(newsF.newInstance(kindBean.getData().get(i).getDictCode()+""));
                }
                viewPager2.post(new Runnable() {
                    @Override
                    public void run() {
                    //设置ViewPager2的适配器
                        viewPager2.setAdapter(new PagerAdapter((FragmentActivity)getContext(),list));

						//使ViewPager2与Tablayout联动
                        new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
                            @Override
                            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                                tab.setText(kindBean.getData().get(position).getDictLabel());
                            }
                        }).attach();
                    }
                });
            }
        });
    }

ViewPager2的适配器

package com.example.packagingview.MainActivity;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;

import java.util.List;

public class PagerAdapter extends FragmentStateAdapter {

    List<Fragment> list;

    public PagerAdapter(@NonNull FragmentActivity fragmentActivity,List<Fragment> list) {
        super(fragmentActivity);
        this.list = list;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return list.get(position);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
}

Fragment中的代码

package com.example.packagingview.MainActivity;

import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.packagingview.R;
import com.google.gson.Gson;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;


public class newsF extends Fragment {
    private static final String ARG_PARAM1 = "param1";
    private ImageView NewsPhoto;
    private TextView NewsTitle;
    private TextView NewsContent;
    private TextView newsTime;
    private TextView newsCount;
    private ImageView imageView2;
    private RecyclerView recycleView;
    public static newsF newInstance(String dictCode) {
        newsF fragment = new newsF();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, dictCode);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       View view =inflater.inflate(R.layout.fragment_news, container, false);
        NewsPhoto = view.findViewById(R.id.NewsPhoto);
        NewsTitle = view.findViewById(R.id.NewsTitle);
        NewsContent = view.findViewById(R.id.NewsContent);
        newsTime = view.findViewById(R.id.newsTime);
        newsCount = view.findViewById(R.id.newsCount);
        imageView2 = view.findViewById(R.id.imageView2);
        recycleView = view.findViewById(R.id.recycleView);
        initView();
       return view;
    }

    public void initView(){
        OkHttpUtils.getCall("http://124.93.196.45:10002/press/press/list?pageNum=1&pageSize=10&pressCategory="+getArguments().getString(ARG_PARAM1)).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d("TAG", "onFailure: "+e.getMessage());
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                NewsBean bean = new Gson().fromJson(response.body().string(),NewsBean.class);
                recycleView.post(new Runnable() {
                    @Override
                    public void run() {
                        LinearLayoutManager manager = new LinearLayoutManager(getContext());
                        manager.setOrientation(RecyclerView.VERTICAL);
                        RecycleViewAdapter adapter = new RecycleViewAdapter(R.layout.news_item,getContext(),bean.getRows());
                        recycleView.setLayoutManager(manager);
                        recycleView.setAdapter(adapter);
                    }
                });
            }
        });
    }
}

二、封装ViewPager2 + TabLayout + Fragment

如果在多个场景都要使用这个布局及其资源,那么我们和不妨把它做成一个控件来使用呢?
如下操作

在之前代码上稍作修改,使这个类继承自线性布局,然后再Xml布局文件中我们就可以使用我们自己自定义的控件了

package com.example.packagingview.MainActivity;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;

import com.example.packagingview.R;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import com.google.gson.Gson;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

public class tabsPagersF extends LinearLayout {
    private com.google.android.material.tabs.TabLayout tabLayout;
    private androidx.viewpager2.widget.ViewPager2 viewPager2;
    private List<Fragment> list = new ArrayList<>();
    public tabsPagersF(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        View view = LayoutInflater.from(context).inflate(R.layout.tablayout_viewpager2_fragment,this);
        tabLayout = view.findViewById(R.id.TabLayout);
        viewPager2 = view.findViewById(R.id.ViewPager2);
        initView();
    }
    public void initView(){

        OkHttpUtils.getCall("http://124.93.196.45:10002"+"/system/dict/data/type/press_category").enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d("TAG", "onFailure: "+e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                KindBean kindBean= new Gson().fromJson(response.body().string(),KindBean.class);

                for (int i = 0; i < kindBean.getData().size(); i++) {
                    list.add(newsF.newInstance(kindBean.getData().get(i).getDictCode()+""));
                }
                viewPager2.post(new Runnable() {
                    @Override
                    public void run() {
                        viewPager2.setAdapter(new PagerAdapter((FragmentActivity)getContext(),list));

                        new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
                            @Override
                            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                                tab.setText(kindBean.getData().get(position).getDictLabel());
                            }
                        }).attach();
                    }
                });
            }
        });
    }
    public void initView2(String[] tabs){
        for (int i = 0; i < tabs.length; i++) {
            list.add(ItemFragment.newInstance(20));
        }
        viewPager2.setAdapter(new PagerAdapter((FragmentActivity)getContext(),list));
        new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                tab.setText(tabs[position]);
            }
        }).attach();
    }
}

使用方法
注意看准包名

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity.MainActivity">
    <com.example.packagingview.MainActivity.tabsPagersF
        android:id="@+id/MyCon"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

好好学习,天天向上。

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
实现 ViewPager2+TabLayout+Fragment 实现页面切换,需要以下步骤: 1. 在 XML 布局文件中定义 ViewPager2TabLayout,并将它们嵌套在一个父布局中。 ```xml <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.tabs.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="scrollable" app:tabGravity="center"/> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/tab_layout" app:layout_constraintBottom_toBottomOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> ``` 2. 创建 Fragment,并实现 ViewPager2 的适配器。 ```kotlin class MyFragmentAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) { private val fragmentList = listOf( FirstFragment(), SecondFragment(), ThirdFragment() ) override fun getItemCount() = fragmentList.size override fun createFragment(position: Int) = fragmentList[position] } ``` 3. 在 Activity 或 Fragment 中,初始化 ViewPager2TabLayout,并将适配器设置给 ViewPager2。 ```kotlin val viewPager: ViewPager2 = findViewById(R.id.view_pager) val tabLayout: TabLayout = findViewById(R.id.tab_layout) val adapter = MyFragmentAdapter(this) viewPager.adapter = adapter TabLayoutMediator(tabLayout, viewPager) { tab, position -> tab.text = "Tab ${position + 1}" }.attach() ``` 这样就可以实现 ViewPager2+TabLayout+Fragment 实现页面切换了。注意,TabLayoutMediator 是用来关联 TabLayout 和 ViewPager2 的,它的第一个参数是 TabLayout,第二个参数是 ViewPager2,第三个参数是一个回调函数,用来设置 TabLayout 的标签文本。在最后一行调用 attach() 方法即可完成关联。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值