android Tablayout+ViewPager实现选项卡滑动效果(战区排行榜)

范浩宕
2023-12-01

实现,县级、市级、省级三个fragment切换

1.排行榜的布局文件 activity_region_list.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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".RegionListActivity"
    android:background="@color/weakgreen"
    android:orientation="vertical">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_gravity="center"
        android:background="@color/weakgreen">
        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:background="@color/green">
            <TextView
                android:id="@+id/text_region_list"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="战区排行榜"
                android:textColor="@color/white"
                android:textSize="30sp"
                android:textStyle="bold"
                android:layout_gravity="bottom|center"
                android:layout_marginBottom="5dp"
                android:layout_centerInParent="true"
                />
        </androidx.appcompat.widget.Toolbar>
    </RelativeLayout>
    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tl_tab_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        app:tabGravity="fill"
        app:tabMaxWidth="0dp"
        app:tabIndicatorFullWidth="false"
        app:tabMode="fixed">
    </com.google.android.material.tabs.TabLayout>
<!--    app:tabBackground="@color/green"-->
    <androidx.viewpager.widget.ViewPager
        android:id="@+id/vpager_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </androidx.viewpager.widget.ViewPager>
</LinearLayout>

2.排行榜的java代码 RegionListActivity.java

public class RegionListActivity extends AppCompatActivity {

    TabLayout mTablayout;
    ViewPager mViewPager;
    private TabLayout.Tab tab_county,tab_city,tab_province;
    private String phone ="";
    private String province,city,county;

    private List<RegionUser> regionUsers = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getSupportActionBar().hide();
        setContentView(R.layout.activity_region_list);
        setTransparent(getWindow());
        setToolbarTitleFont();//设置Toolbar标题字体
        Intent intent = getIntent();
        phone = intent.getStringExtra("phone");
        province = intent.getStringExtra("province");
        city = intent.getStringExtra("city");
        county = intent.getStringExtra("county");
        Log.i("sss", "RegionListActivity接收到的phone:"+phone);
        initViews();
        initEvents();
//        initRegions();
//        RecyclerView recyclerView = findViewById(R.id.recycler_view_2);
//        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
//        recyclerView.setLayoutManager(layoutManager);
//        RegionListAdapter regionListAdapter = new RegionListAdapter(regionUsers);
//        recyclerView.setAdapter(regionListAdapter);
    }

    public void setToolbarTitleFont(){//设置标题的字体
        Typeface font = Typeface.createFromAsset(getAssets(),"fonts/悠然小楷.ttf");
        TextView tv1 = findViewById(R.id.text_region_list);
        tv1.setTypeface(font);
    }

    private void initEvents() {
        mTablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                if (tab == mTablayout.getTabAt(0)) {
                    mViewPager.setCurrentItem(0);
                } else if (tab == mTablayout.getTabAt(1)) {
                    mViewPager.setCurrentItem(1);
                }else if(tab == mTablayout.getTabAt(2)){
                    mViewPager.setCurrentItem(2);
                }

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
    }

    private void initViews() {
        mTablayout = (TabLayout)findViewById(R.id.tl_tab_main);
        mViewPager = (ViewPager)findViewById(R.id.vpager_main);

        mViewPager.setAdapter(new RegionPagerAdapter(getSupportFragmentManager()));
        mTablayout.setupWithViewPager(mViewPager);

        //初始化tab
        tab_county = mTablayout.getTabAt(0); //县级
        tab_city = mTablayout.getTabAt(1);     //市级
        tab_province = mTablayout.getTabAt(2);  //省级

        //初始化
        mViewPager.setCurrentItem(0);
    }

//    private void initRegions(){
//        for(int i=0;i<10;i++){
//            RegionUser regionUser1=new RegionUser("关羽",R.drawable.icon_boy,5000);
//            regionUsers.add(regionUser1);
//            RegionUser regionUser2=new RegionUser("上官婉儿",R.drawable.icon_girl,6000);
//            regionUsers.add(regionUser2);
//        }
//    }

    private static void setTransparent(@NonNull Window window) {//全屏显示
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            window.setStatusBarColor(Color.TRANSPARENT);
        }
    }
}

3. 适配器 RegionPagerAdapter

public class RegionPagerAdapter extends FragmentPagerAdapter {
    private String[] mTitles = {"县级","市级","省级"};
    public RegionPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        if (i == 1){
            return new CityFragment();
        }
        if (i == 2){
            return new ProvinceFragment();
        }
        if(i == 0){
            return new CountyFragment();
        }
        //刚刚进入时选择 县级 Fragment
        return new CountyFragment();
    }

    @Override
    public int getCount() {
        return mTitles.length;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mTitles[position];
    }
}

4.fragment的懒加载 BaseFragment

public abstract class BaseFragment extends Fragment {

    private static final String TAG = BaseFragment.class.getSimpleName();

    private boolean isFragmentVisible;
    private boolean isReuseView;
    private boolean isFirstVisible;
    private View rootView;

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        //setUserVisibleHint()有可能在fragment的生命周期外被调用
        if (rootView == null) {
            return;
        }
        if (isFirstVisible && isVisibleToUser) {
            onFragmentFirstVisible();
            isFirstVisible = false;
        }
        if (isVisibleToUser) {
            onFragmentVisibleChange(true);
            isFragmentVisible = true;
            return;
        }
        if (isFragmentVisible) {
            isFragmentVisible = false;
            onFragmentVisibleChange(false);
        }
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initVariable();
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
      
        if (rootView == null) {
            rootView = view;
            if (getUserVisibleHint()) {
                if (isFirstVisible) {
                    onFragmentFirstVisible();
                    isFirstVisible = false;
                }
                onFragmentVisibleChange(true);
                isFragmentVisible = true;
            }
        }
        super.onViewCreated(isReuseView ? rootView : view, savedInstanceState);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        initVariable();
    }

    private void initVariable() {
        isFirstVisible = true;
        isFragmentVisible = false;
        rootView = null;
        isReuseView = true;
    }

    /**
     * 设置是否使用 view 的复用,默认开启
     *
     * @param isReuse
     */
    protected void reuseView(boolean isReuse) {
        isReuseView = isReuse;
    }

    /**
     * 去除setUserVisibleHint()多余的回调场景,保证只有当fragment可见状态发生变化时才回调
     * 回调时机在view创建完后,所以支持ui操作,解决在setUserVisibleHint()里进行ui操作有可能报null异常的问题
     *
     * 可在该回调方法里进行一些ui显示与隐藏,比如加载框的显示和隐藏
     *
     * @param isVisible true  不可见 -> 可见
     *                  false 可见  -> 不可见
     */
    protected void onFragmentVisibleChange(boolean isVisible) {

    }

    /**
     * 在fragment首次可见时回调,可在这里进行加载数据,保证只在第一次打开Fragment时才会加载数据,
     * 这样就可以防止每次进入都重复加载数据
     * 该方法会在 onFragmentVisibleChange() 之前调用,所以第一次打开时,可以用一个全局变量表示数据下载状态,
     * 然后在该方法内将状态设置为下载状态,接着去执行下载的任务
     * 最后在 onFragmentVisibleChange() 里根据数据下载状态来控制下载进度ui控件的显示与隐藏
     */
    protected void onFragmentFirstVisible() {

    }

    protected boolean isFragmentVisible() {
        return isFragmentVisible;
    }
}

5.Tab页面(以县级CountyFragment为例)  CountyFragment

public class CountyFragment extends BaseFragment {
    private String phone ="";
    private String province,city,county;
    private String string = "";
    private List<UserListInfo> userListInfos = new ArrayList<>();
    public static final int PAINT = 1;

    private List<RegionUser> regionUsers = new ArrayList<>();
    View view;
    RecyclerView recyclerView;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (view ==null){
            view = inflater.inflate(R.layout.fragment_region_county,container,false);

        }
        return view;
    }

    @Override
    protected void onFragmentVisibleChange(boolean isVisible) {
        if (isVisible) {
            Log.i("sss", "county可见了");
        } else {
//                    setRefresh(false);
        }
    }

    @Override
    protected void onFragmentFirstVisible() {
        Intent intent = getActivity().getIntent();
        phone = intent.getStringExtra("phone");
        province = intent.getStringExtra("province");
        city = intent.getStringExtra("city");
        county = intent.getStringExtra("county");
        Log.i("sss", "县级战区fragment接收到的数据: "+phone);
        ViewRegionList();
        recyclerView = view.findViewById(R.id.recycler_view_2);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this.getActivity());
        recyclerView.setLayoutManager(layoutManager);
    }

    public void ViewRegionList() {

        new Thread(new Runnable() {
            @Override
            public void run() {
                Gson gson = new Gson();
                //登录请求转json字符串
                ViewRegionListRequest viewRegionListRequest = new ViewRegionListRequest();
                viewRegionListRequest.setProvince(province);
                viewRegionListRequest.setCity(city);
                viewRegionListRequest.setCounty(county);
                viewRegionListRequest.setPhone(phone);
                viewRegionListRequest.setFlag(1);
                Log.i("sss", "run调用战区排行榜接口(县级)"+viewRegionListRequest.toString());
                MediaType type = MediaType.parse("application/json;charset=utf-8");
                //放入请求体
                RequestBody RequestBody2 = RequestBody.create(type, "" +  gson.toJson(viewRegionListRequest));
                try {
                    OkHttpClient client = new OkHttpClient();
                    Request request = new Request.Builder()
                            // 指定访问的服务器地址
                            .url("http://59.xxx.xxx.xxx:9091/heart_flow/region/viewRegionList").post(RequestBody2)
                            .build();
                    Response response = client.newCall(request).execute();
                    String responseData = response.body().string();
                    //解析json
                    parseJSONWithJSONObject(responseData);
                    //提交文本框更新消息
                    Message message = new Message();
                    message.what = PAINT;
                    handler.sendMessage(message);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private void parseJSONWithJSONObject(String jsonData) throws JSONException {
        Gson gson = new Gson();
        //解析外面那层
        ResponseInfo responseInfo = gson.fromJson(jsonData,ResponseInfo.class);
        string = responseInfo.getCode().toString();
        Log.i("sss", "code(成功为0):"+string);
        //解析userInfo对象
        if (string.equals("0")){
            userListInfos = gson.fromJson(responseInfo.getData().toString(),new TypeToken<List<UserListInfo>>(){}.getType());
            Log.d("sss", "county接收到的用户列表:" + ""+userListInfos.toString());
            Log.i("sss", "county的code: "+string);
        }
    }

    private Handler handler = new Handler(){
        public void handleMessage(Message msg){
            switch (msg.what){
                case PAINT:
                    initRegions();
                    Log.i("sss", "county 加载完数据");
                    RegionListAdapter regionListAdapter = new RegionListAdapter(regionUsers);
                    recyclerView.setAdapter(regionListAdapter);
                    regionUsers =null;
                    Log.i("sss", "county 将regionUsers置为null ");
                    break;
                default:break;
            }
        }
    };

    private void initRegions(){
        for (UserListInfo userListInfo:userListInfos){
            RegionUser regionUser1=new RegionUser(userListInfos.indexOf(userListInfo)+1,userListInfo.getUname(),R.drawable.icon_boy,userListInfo.getCombatPower());
            regionUsers.add(regionUser1);

        }
    }
}

 

 

 

 类似资料: