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>