实现,县级、市级、省级三个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);
}
}
}