Android 中间的tab会锁在顶部

fragment_classify

<androidx.coordinatorlayout.widget.CoordinatorLayout 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">

    <!-- AppBarLayout:顶部的折叠布局 -->
    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="150dp"
        app:elevation="0dp">

        <!-- CollapsingToolbarLayout:折叠的工具栏布局 -->
        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:elevation="0dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <androidx.viewpager.widget.ViewPager
                    android:id="@+id/bannerViewPager"
                    android:layout_width="match_parent"
                    android:layout_height="130dp"/>

            </LinearLayout>
        </com.google.android.material.appbar.CollapsingToolbarLayout>
    </com.google.android.material.appbar.AppBarLayout>

    <!-- TabLayout:水平的 Tab 列表 -->
    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:tabGravity="fill"
        app:tabIndicatorColor="#FF5449C8"
        app:tabMaxWidth="150dp"
        app:tabMode="fixed"
        app:tabSelectedTextColor="#333333"
        app:tabTextAppearance="@style/CustomTabTextAppearance"
        app:tabTextColor="#80333333"
        app:tabIndicatorFullWidth="false"/>

    <!-- ViewPager:显示 Tab 对应的内容 -->
    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="70dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:background="@color/white"
        android:paddingStart="5dp"
        android:paddingEnd="5dp"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

ClassifyFragment

package com.jiuhong.mbtirgtest.ui.fragment;

import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;

import com.google.android.material.tabs.TabLayout;
import com.jiuhong.mbtirgtest.R;
import com.jiuhong.mbtirgtest.common.Global;
import com.jiuhong.mbtirgtest.ui.adapter.BannerAdapter;

import java.util.ArrayList;
import java.util.List;

public class ClassifyFragment extends Fragment {

    private ViewPager bannerViewPager;
    private TabLayout bannerIndicator;
    private List<String> imageUrls = new ArrayList<>(); // 存储图片的 URL
    private List<String> imageLinks = new ArrayList<>(); // 存储图片点击后的链接

    private static final int AUTO_SCROLL = 1;
    private static final int SCROLL_INTERVAL = 3000; // 每 3 秒切换一次

    ViewPager viewPager;

    TabLayout tabLayout;

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (!imageUrls.isEmpty()) {
                if (msg.what == AUTO_SCROLL) {
                    int currentItem = bannerViewPager.getCurrentItem();
                    int nextItem = (currentItem + 1) % imageUrls.size();
                    bannerViewPager.setCurrentItem(nextItem, true);
                    handler.sendEmptyMessageDelayed(AUTO_SCROLL, SCROLL_INTERVAL); // 延时执行
                }
            }
        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // 返回 Fragment 的布局
        View rootView = inflater.inflate(R.layout.fragment_classify, container, false);

        // 初始化 ViewPager 和 TabLayout
        viewPager = rootView.findViewById(R.id.viewPager);
        tabLayout = rootView.findViewById(R.id.tabLayout);

        // 初始化 ViewPager 和 TabLayout
        bannerViewPager = rootView.findViewById(R.id.bannerViewPager);

        tabLayout.setTabRippleColor(null);

        //设置banner
        setBanner();

        //设置tab列表
        setTabList();
        return rootView;
    }

//    public boolean handleWebViewBackPress() {
//        if (webViewFragment2 != null && webViewFragment2.canWebViewGoBack()) {
//            webViewFragment2.goWebViewBack();
//            return true; // WebView 已处理返回操作
//        }
//        return false; // WebView 无法处理返回操作
//    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        handler.removeMessages(AUTO_SCROLL); // 停止轮播
    }

    private void setBanner() {
        // 初始化图片 URL 和链接
        imageUrls = new ArrayList<>();
        imageLinks = new ArrayList<>();

        for (int i = 0; i < Global.mainBannerList.size(); i++) {
            imageUrls.add(Global.mainBannerList.get(i).getImage());
            imageLinks.add(Global.mainBannerList.get(i).getUri());
        }

        // 设置适配器
        BannerAdapter bannerAdapter = new BannerAdapter(getActivity(), imageUrls, imageLinks);
        bannerViewPager.setAdapter(bannerAdapter);

        // 设置 TabLayout 与 ViewPager 关联
//        bannerIndicator.setupWithViewPager(bannerViewPager, true);

        // 启动轮播
        handler.sendEmptyMessageDelayed(AUTO_SCROLL, SCROLL_INTERVAL);

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

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

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

    private void setTabList() {
        // 创建 FragmentPagerAdapter
        FragmentPagerAdapter adapter = new FragmentPagerAdapter(getChildFragmentManager(),
                FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
            @Override
            public Fragment getItem(int position) {
                // 根据 position 返回对应的 Fragment
                if (position == 0) {
                    return ClassifyListFragment.newInstance(2); // Tab 1 对应的 Fragment
                } else if(position==1){
                    return ClassifyListFragment.newInstance(3); // Tab 2 对应的 Fragment
                }else {
                    return ClassifyListFragment.newInstance(4); // Tab 2 对应的 Fragment
                }
            }

            @Override
            public int getCount() {
                return 3; // 返回 Tab 数量
            }

            @Override
            public CharSequence getPageTitle(int position) {
                return position == 0 ? "精选" : position == 1?"自我":"情感"; // 设置 Tab 的标题
            }
        };
        // 设置适配器
        viewPager.setAdapter(adapter);
        // 将 TabLayout 和 ViewPager 关联
        tabLayout.setupWithViewPager(viewPager);
    }

}

ClassifyListFragment

package com.jiuhong.mbtirgtest.ui.fragment;

import static android.content.ContentValues.TAG;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.alibaba.android.arouter.launcher.ARouter;
import com.google.gson.Gson;
import com.jiuhong.mbtirgtest.R;
import com.jiuhong.mbtirgtest.common.EventKey;
import com.jiuhong.mbtirgtest.common.Global;
import com.jiuhong.mbtirgtest.handle.MyUriHandler;
import com.jiuhong.mbtirgtest.httpUtil.HttpUtil;
import com.jiuhong.mbtirgtest.httpUtil.api;
import com.jiuhong.mbtirgtest.model.ClassifyAllListModel;
import com.jiuhong.mbtirgtest.model.DailyTestModel;
import com.jiuhong.mbtirgtest.model.GetTestModel;
import com.jiuhong.mbtirgtest.ui.adapter.ClassifyAllDataAdapter;
import com.jiuhong.mbtirgtest.ui.adapter.DailyTestAdapter;
import com.songcha.library_business.helper.UMengHelper;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ClassifyListFragment extends Fragment {
    private RecyclerView recyclerView;

    private static final String ARG_PARAM = "param";

    private int type; //类型:1全部,2精选,3自我,4情感

    private List<ClassifyAllListModel> classifyAllListModelList = new ArrayList<>();

    int listSize = 0;

    public static ClassifyListFragment newInstance(int param) {
        ClassifyListFragment fragment = new ClassifyListFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_PARAM, param);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            type = getArguments().getInt(ARG_PARAM);
            Log.d("ClassifyListFragment", "Received param: " + type);
        }
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_classify_list, container, false);
        recyclerView = view.findViewById(R.id.recycler_classify);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 2);
        recyclerView.setLayoutManager(gridLayoutManager);

        if (type == 2) {
            getMoneyList();//精选列表
        } else if (type == 3) {
            getSelfOrEmotionList(1);//自我
        } else if (type == 4) {
            getSelfOrEmotionList(2);//情感
        } else if (type == 5) {
            //首页嵌套的列表,需要不滑动
            recyclerView.setNestedScrollingEnabled(false);
            getSelfOrEmotionList(1);//自我
        }

        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        if (type == 5 && listSize != 0) {
            if(getContext()!=null){
                // 重新计算布局高度
                View view = getView();
                if (view != null) {
                    // 如果 ListFragment 在显示时,手动更新其布局高度
                    view.post(() -> {
                        int height = getContext().getResources().getDimensionPixelSize(R.dimen.classify_height) * listSize;
                        view.getLayoutParams().height = height;
                        view.requestLayout();
                    });
                }
            }
        }
    }

    private void getMoneyList() {
        //获取签到的数量
        Map<String, String> extraParams = new HashMap<>();
        HttpUtil.sendGetRequest(getContext(), api.getMbttMoney, new HttpUtil.HttpCallback() {
            @Override
            public void onSuccess(String responseBody) {
                if (getActivity() != null) {
                    getActivity().runOnUiThread(() -> {
                        Log.d("测试列表", responseBody);
                        Gson gson = new Gson();
                        List<GetTestModel.DataBean> finalData = new ArrayList<>();
                        GetTestModel getSignNumModel = gson.fromJson(responseBody, GetTestModel.class);
                        for (int i = 0; i < Global.testH5Url.size(); i++) {
                            for (int a = 0; a < getSignNumModel.getData().size(); a++) {
                                if (Global.testH5Url.get(i).getVersion().equals(getSignNumModel.getData().get(a).getVersion())) {
                                    //version相同
                                    if (Global.testH5Url.get(i).getSort() != 0) {
                                        //sort不为0
                                        if ((getSignNumModel.getData().get(a).getSign().equals("10085")) && getSignNumModel.getData().get(a).getStage() == 3) {
                                            if (Global.testH5Url.get(i).getDesc() != null) {
                                                getSignNumModel.getData().get(a).setDescriptionExplain(Global.testH5Url.get(i).getDesc());
                                            }
                                            if (Global.testH5Url.get(i).getImage() != null) {
                                                getSignNumModel.getData().get(a).setImg(Global.testH5Url.get(i).getImage());
                                            }
                                            if (Global.testH5Url.get(i).getTitle() != null) {
                                                getSignNumModel.getData().get(a).setDescription(Global.testH5Url.get(i).getTitle());
                                            }

                                            finalData.add(getSignNumModel.getData().get(a));
                                        }
                                    }
                                }
                            }
                        }
                        classifyAllListModelList.clear();
                        for (int i = 0; i < finalData.size(); i++) {
                            ClassifyAllListModel classifyAllListModel = new ClassifyAllListModel();
                            classifyAllListModel.setImg(finalData.get(i).getImg());
                            classifyAllListModel.setListType(1);
                            classifyAllListModel.setVersion(finalData.get(i).getVersion());
                            classifyAllListModel.setHaveSeen(finalData.get(i).getHaveSeen());
                            classifyAllListModel.setTitle(finalData.get(i).getDescription());
                            classifyAllListModel.setIntroduceInfo(finalData.get(i).getDescriptionExplain());
                            classifyAllListModel.setMoney(finalData.get(i).getMoney());
                            classifyAllListModelList.add(classifyAllListModel);
                        }
                        Log.d("", "" + finalData);
                        ClassifyAllDataAdapter adapter = new ClassifyAllDataAdapter(classifyAllListModelList, new ClassifyAllDataAdapter.OnItemClick() {
                            @Override
                            public void onItemClick(int position) {
                                ClassifyAllListModel item = classifyAllListModelList.get(position);
                                for (int i = 0; i < Global.testH5Url.size(); i++) {
                                    if (item.getVersion().equals(Global.testH5Url.get(i).getVersion())) {
                                        MyUriHandler.handle(Global.testH5Url.get(i).getUri());
                                    }
                                }

                                if (getContext() != null) {
                                    HashMap<String, Object> map = new HashMap<>();
                                    map.put("version", item.getVersion());
                                    UMengHelper.onUMEvent(getContext(), EventKey.CLICK_DAILY_TEST_ITEM, map);
                                }
                            }
                        });
                        recyclerView.setAdapter(adapter);
                    });
                }
            }

            @Override
            public void onFailure(Exception e) {
                // 请求失败,处理错误
                Log.e(TAG, "Error123: " + e.getMessage(), e);
            }
        }, extraParams);
    }

    private void getSelfOrEmotionList(int type) {
        //获取测试列表,type:1为自我,2是情感
        Map<String, String> extraParams = new HashMap<>();
        HttpUtil.sendGetRequest(getContext(), api.getEverydayTest, new HttpUtil.HttpCallback() {
            @Override
            public void onSuccess(String responseBody) {
                if (getActivity() != null) {
                    getActivity().runOnUiThread(() -> {
                        Log.d("测试列表", responseBody);
                        Gson gson = new Gson();
                        List<DailyTestModel.DataBean> finalData = new ArrayList<>();
                        DailyTestModel getSignNumModel = gson.fromJson(responseBody, DailyTestModel.class);
                        for (int a = 0; a < getSignNumModel.getData().size(); a++) {

                            if (type == 1) {
                                if (getSignNumModel.getData().get(a).getTag().equals("自我")) {
                                    finalData.add(getSignNumModel.getData().get(a));
                                }
                            }

                            if (type == 2) {
                                if (getSignNumModel.getData().get(a).getTag().equals("情感")) {
                                    finalData.add(getSignNumModel.getData().get(a));
                                }
                            }

                        }
                        listSize = finalData.size() / 2;


                        Log.d("", "" + finalData);
                        DailyTestAdapter adapter = new DailyTestAdapter(finalData, new DailyTestAdapter.OnItemClick() {
                            @Override
                            public void onItemClick(int position) {
                                DailyTestModel.DataBean item = finalData.get(position);
                                ARouter.getInstance().build("/tqa/DailyTestTipActivity")
                                        .withString("title", item.getTitle())
                                        .withString("version", item.getVersion())
                                        .withInt("test_count", item.getHaveSeen())
                                        .withString("image", item.getImg())
                                        .navigation();
                            }
                        });
                        recyclerView.setAdapter(adapter);
                    });
                }
            }

            @Override
            public void onFailure(Exception e) {
                // 请求失败,处理错误
                Log.e(TAG, "Error123: " + e.getMessage(), e);
            }
        }, extraParams);
    }
}

fragment_classify_list

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_classify"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值