From 462d583986e4739f7a75227b3fde4da587502ba5 Mon Sep 17 00:00:00 2001
From: Administrator <123>
Date: Fri, 05 Nov 2021 03:20:39 +0000
Subject: [PATCH] 主页 动态UI adapter null视图问题修改 分页框架 include问题
---
app/src/main/res/layout/home_item_classify.xml | 9
app/src/main/res/menu/bottom_nav_menu.xml | 12 +
app/src/main/java/com/duqing/missions/base/activities/BaseLoadPageActivity.java | 28 ++-
app/src/main/java/com/duqing/missions/ui/main/home/adapter/MissionTopAdapter.java | 3
app/src/main/java/com/duqing/missions/base/activities/BaseActivity.java | 10
app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicFragment.java | 38 ++++
app/src/main/java/com/duqing/missions/ui/main/home/model/Classify.java | 10 +
app/src/main/res/drawable/ic_hall_black_24dp.xml | 0
app/src/main/res/layout/fragment_sub_hall.xml | 1
app/src/main/java/com/duqing/missions/ui/main/home/HomeFragment.java | 10 +
app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicViewModel.java | 9 +
app/src/main/res/drawable/ic_mine_black_24.xml | 9 +
app/src/main/java/com/duqing/missions/ui/main/hall/SubHallFragment.java | 11
app/src/main/java/com/duqing/missions/ui/main/home/adapter/MissionAdapter.java | 3
app/src/main/res/values/strings.xml | 5
app/src/main/res/drawable/ic_dynamic_black_24dp.xml | 0
app/src/main/java/com/duqing/missions/ui/main/MainActivity.java | 7
app/src/main/res/layout/fragment_home.xml | 4
app/src/main/java/com/duqing/missions/base/fragments/BaseLoadPageFragment.java | 26 ++
/dev/null | 18 --
app/src/main/java/com/duqing/missions/ui/main/hall/HallFragment.java | 28 ---
app/src/main/java/com/duqing/missions/ui/main/home/adapter/ClassifyAdapter.java | 15 +
app/src/main/java/com/duqing/missions/base/adapter/BaseAdapter.java | 90 +++++-----
app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java | 2
app/src/main/java/com/duqing/missions/base/fragments/BaseFragment.java | 7
app/src/main/java/com/duqing/missions/base/ViewModelFactory.java | 33 ++++
app/src/main/res/layout/item_square.xml | 13 +
app/src/main/res/layout/layout_null.xml | 13
app/src/main/java/com/duqing/missions/ui/main/home/HomeViewModel.java | 12 +
29 files changed, 289 insertions(+), 137 deletions(-)
diff --git a/app/src/main/java/com/duqing/missions/base/ViewModelFactory.java b/app/src/main/java/com/duqing/missions/base/ViewModelFactory.java
new file mode 100644
index 0000000..a760846
--- /dev/null
+++ b/app/src/main/java/com/duqing/missions/base/ViewModelFactory.java
@@ -0,0 +1,33 @@
+package com.duqing.missions.base;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.ViewModel;
+import androidx.lifecycle.ViewModelProvider;
+
+/**
+ * Created by Administrator on 2021/11/4 0004.
+ */
+public class ViewModelFactory implements ViewModelProvider.Factory {
+
+ static ViewModelFactory sInstance;
+
+ public static ViewModelFactory getInstance() {
+ if (sInstance == null) {
+ sInstance = new ViewModelFactory();
+ }
+ return sInstance;
+ }
+
+ @Override
+ public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
+ //noinspection TryWithIdenticalCatches
+ try {
+ return modelClass.newInstance();
+ } catch (InstantiationException e) {
+ throw new RuntimeException("Cannot create an instance of " + modelClass, e);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException("Cannot create an instance of " + modelClass, e);
+ }
+ }
+
+}
diff --git a/app/src/main/java/com/duqing/missions/base/activities/BaseActivity.java b/app/src/main/java/com/duqing/missions/base/activities/BaseActivity.java
index ada8707..877c655 100644
--- a/app/src/main/java/com/duqing/missions/base/activities/BaseActivity.java
+++ b/app/src/main/java/com/duqing/missions/base/activities/BaseActivity.java
@@ -32,6 +32,7 @@
import com.duqing.missions.MyApplication;
import com.duqing.missions.R;
+import com.duqing.missions.base.ViewModelFactory;
import com.duqing.missions.data.ApkUpGradeResult;
import com.duqing.missions.util.MyLog;
import com.duqing.missions.util.ResPonse;
@@ -110,16 +111,16 @@
// get genericity "B"
setStatusBarBgColor(R.color.white);
setStatusBarTextColor(true);
+ final ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
try {
- final ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
Class<B> entityClass = (Class<B>) type.getActualTypeArguments()[0];
Method method = entityClass.getMethod("inflate", LayoutInflater.class);//get method from name "inflate";
binding = (B) method.invoke(entityClass,getLayoutInflater());//execute method to create a objct of viewbind;
- Class<VM> vmClass = (Class<VM>) type.getActualTypeArguments()[1];
- viewModel = new ViewModelProvider(this).get(vmClass);
} catch (Exception e) {
e.printStackTrace();
}
+ Class<VM> vmClass = (Class<VM>) type.getActualTypeArguments()[1];
+ viewModel = new ViewModelProvider(this,getViewModelFactory()).get(vmClass);
setContentView(binding.getRoot());
mContext = this;
try {
@@ -133,6 +134,9 @@
public abstract void initViews();
+ public ViewModelProvider.Factory getViewModelFactory(){
+ return ViewModelFactory.getInstance();
+ }
public void setStatusBarTransparent(boolean isBlack){
//透明状态栏
diff --git a/app/src/main/java/com/duqing/missions/base/activities/BaseLoadPageActivity.java b/app/src/main/java/com/duqing/missions/base/activities/BaseLoadPageActivity.java
index bcd52ad..81f9dd4 100644
--- a/app/src/main/java/com/duqing/missions/base/activities/BaseLoadPageActivity.java
+++ b/app/src/main/java/com/duqing/missions/base/activities/BaseLoadPageActivity.java
@@ -10,6 +10,7 @@
import com.duqing.missions.base.adapter.BaseAdapter;
import com.duqing.missions.base.model.BaseLoadPageViewModel;
import com.duqing.missions.data.BasePageResult;
+import com.duqing.missions.databinding.RefreshRecyclerBinding;
import com.scwang.smart.refresh.footer.ClassicsFooter;
import com.scwang.smart.refresh.header.ClassicsHeader;
import com.scwang.smart.refresh.layout.SmartRefreshLayout;
@@ -37,19 +38,30 @@
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- Class<A> entityClass = (Class<A>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[2];
try {
+ Class<A> entityClass = (Class<A>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[2];
this.adapter = entityClass.newInstance();//实例化泛型
- smartRefresh = (SmartRefreshLayout) binding.getClass().getDeclaredField("smartRefresh").get(binding);
- smartRefresh.setRefreshHeader(new ClassicsHeader(mContext));
- smartRefresh.setRefreshFooter(new ClassicsFooter(mContext));
- smartRefresh.setOnRefreshLoadMoreListener(this);
+ String smartStr = "smartRefresh";
+ smartRefresh = (SmartRefreshLayout) binding.getClass().getField(smartStr).get(binding);
recycler = (RecyclerView) binding.getClass().getDeclaredField("recycler").get(binding);
- recycler.setLayoutManager(new LinearLayoutManager(mContext));
- recycler.setAdapter(adapter);
- } catch (Exception e) {
+ } catch (NoSuchFieldException e) {
+ try {
+ RefreshRecyclerBinding includeRefreshRecycler = (RefreshRecyclerBinding) binding.getClass().getDeclaredField ("includeRefreshRecycler").get(binding);
+ smartRefresh = includeRefreshRecycler.smartRefresh;
+ recycler = includeRefreshRecycler.recycler;
+ } catch (Exception e2) {
+ e2.printStackTrace();
+ }
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (java.lang.InstantiationException e) {
e.printStackTrace();
}
+ smartRefresh.setRefreshHeader(new ClassicsHeader(mContext));
+ smartRefresh.setRefreshFooter(new ClassicsFooter(mContext));
+ smartRefresh.setOnRefreshLoadMoreListener(this);
+ recycler.setLayoutManager(new LinearLayoutManager(mContext));
+ recycler.setAdapter(adapter);
}
private void finishFreshLoadmore(D result){
diff --git a/app/src/main/java/com/duqing/missions/base/adapter/BaseAdapter.java b/app/src/main/java/com/duqing/missions/base/adapter/BaseAdapter.java
index 3f25fc8..3d2cdb0 100644
--- a/app/src/main/java/com/duqing/missions/base/adapter/BaseAdapter.java
+++ b/app/src/main/java/com/duqing/missions/base/adapter/BaseAdapter.java
@@ -2,17 +2,13 @@
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
-import android.view.View;
import android.view.ViewGroup;
-import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewbinding.ViewBinding;
-import com.duqing.missions.R;
import com.duqing.missions.base.activities.BaseActivity;
-import com.duqing.missions.common.NullViewHolder;
import com.duqing.missions.databinding.LayoutNullBinding;
import com.duqing.missions.util.DeviceUtil;
@@ -26,14 +22,14 @@
* T 数据类型
* V 适配器视图
*/
-public abstract class BaseAdapter<B extends ViewBinding,A extends BaseActivity,T> extends RecyclerView.Adapter {
+public abstract class BaseAdapter<B extends ViewBinding,T> extends RecyclerView.Adapter {
protected List<T> mData = new ArrayList<>();
protected Drawable nullDrawable;
protected String nullTxt="暂无数据";
protected String TAG = "BaseAdapter";
- protected A activity;
+ protected BaseActivity activity;
public BaseAdapter(){
}
@@ -54,48 +50,38 @@
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- // get genericity "B"
- Class<B> entityClass = (Class<B>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
- try {
- /* for(Method method: entityClass.getMethods()){
- StringBuilder sb = new StringBuilder();
- for(Class type : method.getParameterTypes()){
- sb.append(type.getSimpleName()+",");
- }
- Log.e(TAG,String.format("method:%s,return:%s,param:%s",method.getName(),method.getReturnType().getSimpleName(),sb.toString()));
- }*/
- Method method = entityClass.getMethod("inflate", LayoutInflater.class,ViewGroup.class,boolean.class);//get method from name "inflate";
- B vBind = (B) method.invoke(entityClass,LayoutInflater.from(parent.getContext()),parent,false);//execute method to create a objct of viewbind;
- return new ViewBindHolder(vBind);
- } catch (Exception e) {
- e.printStackTrace();
+ if(viewType == 1 ){
+ // get genericity "B"
+ Class<B> entityClass = (Class<B>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
+ try {
+ /* for(Method method: entityClass.getMethods()){
+ StringBuilder sb = new StringBuilder();
+ for(Class type : method.getParameterTypes()){
+ sb.append(type.getSimpleName()+",");
+ }
+ Log.e(TAG,String.format("method:%s,return:%s,param:%s",method.getName(),method.getReturnType().getSimpleName(),sb.toString()));
+ }*/
+ Method method = entityClass.getMethod("inflate", LayoutInflater.class,ViewGroup.class,boolean.class);//get method from name "inflate";
+ B vBind = (B) method.invoke(entityClass,LayoutInflater.from(parent.getContext()),parent,false);//execute method to create a objct of viewbind;
+ return new ViewBindHolder(vBind);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
}
- return new NullViewHolder( LayoutNullBinding.inflate(LayoutInflater.from(parent.getContext())));
- }
-
- /**
- *
- * 创建视图
- * @param parent
- * @param layout 视图文件
- * @param viewType 视图类型 1 加载正常视图 其他则加载空数据
- * @return
- */
- protected View getRootView(@NonNull ViewGroup parent, @LayoutRes int layout,int viewType ){
- //MyLog.i(TAG,"getRootView viewType:"+viewType);
- return LayoutInflater.from(parent.getContext()).inflate(viewType==1?layout: R.layout.layout_null,parent,false);
+ return new NullViewHolder( LayoutNullBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
//MyLog.i(TAG,"onBindViewHolder position:"+position+" "+mData.size()+" "+getItemViewType(position));
- if(getItemViewType(position)==0){
- return;
+ if(activity == null){
+ activity = (BaseActivity) holder.itemView.getContext();
}
- try {
- activity = (A) holder.itemView.getContext();
- }catch (Exception e){}
- bindView((ViewBindHolder) holder,mData.size()==0?null:mData.get(position),position);
+ if(getItemViewType(position)==0){
+ bindView((NullViewHolder) holder);
+ }else {
+ bindView((ViewBindHolder) holder, mData.size() == 0 ? null : mData.get(position), position);
+ }
}
/**
@@ -127,6 +113,10 @@
protected abstract void bindView(ViewBindHolder holder,T data,int position);
+ protected void bindView(NullViewHolder holder){
+
+ }
+
@Override
public int getItemCount() {
//默认显示空视图,若不显示空视图则重写该方法,返回mData.size()
@@ -138,17 +128,27 @@
public int getItemViewType(int position) {
//当下标为0,数据集合为0 返回0(意味当前应显示空数据视图))
//MyLog.i(TAG,"getItemViewType position:"+position+" mdata:"+mData.size()+" "+(position ==0 && mData.size()==0));
- return position ==0 && mData.size()==0?0:1;
+ return position == 0 && mData.size()==0?0:1;
}
public class ViewBindHolder extends RecyclerView.ViewHolder{
-
- B binding;
-
+ public B binding;
public ViewBindHolder( B binding) {
super(binding.getRoot());
this.binding = binding;
}
}
+ /**
+ * 空数据显示
+ * Created by Administrator on 2021/10/28 0028.
+ */
+ public class NullViewHolder extends RecyclerView.ViewHolder {
+ LayoutNullBinding binding;
+
+ public NullViewHolder(LayoutNullBinding binding) {
+ super(binding.getRoot());
+ this.binding = binding;
+ }
+ }
}
diff --git a/app/src/main/java/com/duqing/missions/base/fragments/BaseFragment.java b/app/src/main/java/com/duqing/missions/base/fragments/BaseFragment.java
index 882ed3d..789861e 100644
--- a/app/src/main/java/com/duqing/missions/base/fragments/BaseFragment.java
+++ b/app/src/main/java/com/duqing/missions/base/fragments/BaseFragment.java
@@ -11,6 +11,7 @@
import androidx.lifecycle.ViewModelProvider;
import androidx.viewbinding.ViewBinding;
+import com.duqing.missions.base.ViewModelFactory;
import com.duqing.missions.base.activities.BaseActivity;
import java.lang.reflect.Method;
@@ -36,13 +37,17 @@
Method method = entityClass.getMethod("inflate", LayoutInflater.class,ViewGroup.class,boolean.class);//get method from name "inflate";
binding = (B) method.invoke(entityClass,inflater,container,false);//execute method to create a objct of viewbind;
Class<VM> vmClass = (Class<VM>) type.getActualTypeArguments()[1];
- viewModel = new ViewModelProvider(this).get(vmClass);
+ viewModel = new ViewModelProvider(this,getViewModelFactory()).get(vmClass);
} catch (Exception e) {
e.printStackTrace();
}
return binding.getRoot();
}
+ public ViewModelProvider.Factory getViewModelFactory(){
+ return ViewModelFactory.getInstance();
+ }
+
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
diff --git a/app/src/main/java/com/duqing/missions/base/fragments/BaseLoadPageFragment.java b/app/src/main/java/com/duqing/missions/base/fragments/BaseLoadPageFragment.java
index 17f64db..50cabf6 100644
--- a/app/src/main/java/com/duqing/missions/base/fragments/BaseLoadPageFragment.java
+++ b/app/src/main/java/com/duqing/missions/base/fragments/BaseLoadPageFragment.java
@@ -8,6 +8,7 @@
import com.duqing.missions.base.adapter.BaseAdapter;
import com.duqing.missions.base.model.BaseLoadPageViewModel;
import com.duqing.missions.data.BasePageResult;
+import com.duqing.missions.databinding.RefreshRecyclerBinding;
import com.scwang.smart.refresh.footer.ClassicsFooter;
import com.scwang.smart.refresh.header.ClassicsHeader;
import com.scwang.smart.refresh.layout.SmartRefreshLayout;
@@ -38,16 +39,27 @@
try {
Class<A> entityClass = (Class<A>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[2];
this.adapter = entityClass.newInstance();//实例化泛型
- smartRefresh = (SmartRefreshLayout) binding.getClass().getDeclaredField("smartRefresh").get(binding);
- smartRefresh.setRefreshHeader(new ClassicsHeader(getContext()));
- smartRefresh.setRefreshFooter(new ClassicsFooter(getContext()));
- smartRefresh.setOnRefreshLoadMoreListener(this);
+ String smartStr = "smartRefresh";
+ smartRefresh = (SmartRefreshLayout) binding.getClass().getField(smartStr).get(binding);
recycler = (RecyclerView) binding.getClass().getDeclaredField("recycler").get(binding);
- recycler.setLayoutManager(new LinearLayoutManager(getContext()));
- recycler.setAdapter(adapter);
- } catch (Exception e) {
+ } catch (NoSuchFieldException e) {
+ try {
+ RefreshRecyclerBinding includeRefreshRecycler = (RefreshRecyclerBinding) binding.getClass().getDeclaredField ("includeRefreshRecycler").get(binding);
+ smartRefresh = includeRefreshRecycler.smartRefresh;
+ recycler = includeRefreshRecycler.recycler;
+ } catch (Exception e2) {
+ e2.printStackTrace();
+ }
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (java.lang.InstantiationException e) {
e.printStackTrace();
}
+ smartRefresh.setRefreshHeader(new ClassicsHeader(getContext()));
+ smartRefresh.setRefreshFooter(new ClassicsFooter(getContext()));
+ smartRefresh.setOnRefreshLoadMoreListener(this);
+ recycler.setLayoutManager(new LinearLayoutManager(getContext()));
+ recycler.setAdapter(adapter);
}
@Override
diff --git a/app/src/main/java/com/duqing/missions/common/NullViewHolder.java b/app/src/main/java/com/duqing/missions/common/NullViewHolder.java
deleted file mode 100644
index 21bd137..0000000
--- a/app/src/main/java/com/duqing/missions/common/NullViewHolder.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.duqing.missions.common;
-
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.duqing.missions.databinding.LayoutNullBinding;
-
-/**
- * 空数据显示
- * Created by Administrator on 2021/10/28 0028.
- */
-public class NullViewHolder extends RecyclerView.ViewHolder {
- LayoutNullBinding binding;
-
- public NullViewHolder(LayoutNullBinding binding) {
- super(binding.getRoot());
- this.binding = binding;
- }
-}
diff --git a/app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java b/app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java
index 7d5c6d8..f1356e0 100644
--- a/app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java
+++ b/app/src/main/java/com/duqing/missions/ui/login/view/LoginActivity.java
@@ -32,6 +32,8 @@
final EditText phoneEdit = binding.editPhone;
final EditText passwordEditText = binding.editPassword;
final Button loginButton = binding.login;
+
+
viewModel.getLoginFormState().observe(this, new Observer<LoginFormState>() {
@Override
public void onChanged(@Nullable LoginFormState loginFormState) {
diff --git a/app/src/main/java/com/duqing/missions/ui/main/MainActivity.java b/app/src/main/java/com/duqing/missions/ui/main/MainActivity.java
index ba81d04..c02b93e 100644
--- a/app/src/main/java/com/duqing/missions/ui/main/MainActivity.java
+++ b/app/src/main/java/com/duqing/missions/ui/main/MainActivity.java
@@ -3,12 +3,14 @@
import androidx.viewpager2.widget.ViewPager2;
import com.duqing.missions.R;
-import com.duqing.missions.base.adapter.FragmentAdapter;
import com.duqing.missions.base.activities.BaseActivity;
+import com.duqing.missions.base.adapter.FragmentAdapter;
import com.duqing.missions.databinding.ActivityMainBinding;
+import com.duqing.missions.ui.main.dynamic.DynamicFragment;
import com.duqing.missions.ui.main.hall.HallFragment;
import com.duqing.missions.ui.main.home.HomeFragment;
import com.duqing.missions.ui.main.mine.MineFragment;
+import com.google.android.material.navigation.NavigationBarView;
public class MainActivity extends BaseActivity<ActivityMainBinding,MainViewModel> {
@@ -17,6 +19,7 @@
public void initViews() {
setStatusBarBgColor(R.color.red);
setStatusBarTextColor(false);
+ binding.navView.setLabelVisibilityMode(NavigationBarView.LABEL_VISIBILITY_LABELED);
binding.navView.setOnItemSelectedListener(item -> {
for(int i = 0 ; i < binding.navView.getMenu().size() ; i ++){
if(item.getItemId() == binding.navView.getMenu().getItem(i).getItemId()){
@@ -29,6 +32,7 @@
final FragmentAdapter fragmentAdapter = new FragmentAdapter(this);
fragmentAdapter.addFragment(new HomeFragment());
fragmentAdapter.addFragment(new HallFragment());
+ fragmentAdapter.addFragment(new DynamicFragment());
fragmentAdapter.addFragment(new MineFragment());
//设置当前可见Item左右可见page数,次范围内不会被销毁
//禁用预加载
@@ -44,6 +48,5 @@
});
binding.viewPager2.setCurrentItem(0);//设置默认第
}
-
}
\ No newline at end of file
diff --git a/app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicFragment.java b/app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicFragment.java
new file mode 100644
index 0000000..2411e7d
--- /dev/null
+++ b/app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicFragment.java
@@ -0,0 +1,38 @@
+package com.duqing.missions.ui.main.dynamic;
+
+import com.duqing.missions.R;
+import com.duqing.missions.base.fragments.BaseFragment;
+import com.duqing.missions.base.fragments.BaseTabFragment;
+import com.duqing.missions.databinding.LayoutTabViewpagerBinding;
+import com.duqing.missions.ui.main.hall.SubHallFragment;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by Administrator on 2021/11/4 0004.
+ */
+public class DynamicFragment extends BaseTabFragment<LayoutTabViewpagerBinding,DynamicViewModel> {
+
+
+ @Override
+ public void initViews() {
+ super.initViews();
+ binding.tabLayout.setBackgroundColor(getResources().getColor(R.color.red));
+ }
+
+ @Override
+ protected List<String> initTabTitles() {
+ return new ArrayList<>(Arrays.asList(new String[]{"广场","活动","排行"}));
+ }
+
+ @Override
+ protected List<BaseFragment> initFragments() {
+ List<BaseFragment> list = new ArrayList<>();
+ list.add(new SubHallFragment());
+ list.add(new SubHallFragment());
+ list.add(new SubHallFragment());
+ return list;
+ }
+}
diff --git a/app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicViewModel.java b/app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicViewModel.java
new file mode 100644
index 0000000..72ea5f8
--- /dev/null
+++ b/app/src/main/java/com/duqing/missions/ui/main/dynamic/DynamicViewModel.java
@@ -0,0 +1,9 @@
+package com.duqing.missions.ui.main.dynamic;
+
+import androidx.lifecycle.ViewModel;
+
+/**
+ * Created by Administrator on 2021/11/4 0004.
+ */
+public class DynamicViewModel extends ViewModel {
+}
diff --git a/app/src/main/java/com/duqing/missions/ui/main/hall/HallFragment.java b/app/src/main/java/com/duqing/missions/ui/main/hall/HallFragment.java
index 1e55993..f4cf02c 100644
--- a/app/src/main/java/com/duqing/missions/ui/main/hall/HallFragment.java
+++ b/app/src/main/java/com/duqing/missions/ui/main/hall/HallFragment.java
@@ -1,14 +1,9 @@
package com.duqing.missions.ui.main.hall;
-import androidx.annotation.NonNull;
-import androidx.viewpager2.widget.ViewPager2;
-
-import com.duqing.missions.base.adapter.FragmentAdapter;
+import com.duqing.missions.R;
import com.duqing.missions.base.fragments.BaseFragment;
import com.duqing.missions.base.fragments.BaseTabFragment;
import com.duqing.missions.databinding.LayoutTabViewpagerBinding;
-import com.google.android.material.tabs.TabLayout;
-import com.google.android.material.tabs.TabLayoutMediator;
import java.util.ArrayList;
import java.util.Arrays;
@@ -20,26 +15,7 @@
@Override
public void initViews() {
super.initViews();
- final String[] titles = new String[]{"全部","人气","简单","高价"};
- final FragmentAdapter fragmentAdapter = new FragmentAdapter(activity);
- fragmentAdapter.addFragment(new SubHallFragment());
- fragmentAdapter.addFragment(new SubHallFragment());
- fragmentAdapter.addFragment(new SubHallFragment());
- fragmentAdapter.addFragment(new SubHallFragment());
- //设置当前可见Item左右可见page数,次范围内不会被销毁
- //禁用预加载
- binding.viewPager2.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);
- binding.viewPager2.setAdapter(fragmentAdapter);
- binding.viewPager2.setCurrentItem(0);
- binding.viewPager2.setUserInputEnabled(false); //true:滑动,false:禁止滑动
- TabLayoutMediator mediator = new TabLayoutMediator(binding.tabLayout, binding.viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
- @Override
- public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
- tab.setText(titles[position]);
- }
- });
- mediator.attach();
-
+ binding.tabLayout.setBackgroundColor(getResources().getColor(R.color.red));
}
diff --git a/app/src/main/java/com/duqing/missions/ui/main/hall/SubHallFragment.java b/app/src/main/java/com/duqing/missions/ui/main/hall/SubHallFragment.java
index f8fbc44..c3f003e 100644
--- a/app/src/main/java/com/duqing/missions/ui/main/hall/SubHallFragment.java
+++ b/app/src/main/java/com/duqing/missions/ui/main/hall/SubHallFragment.java
@@ -1,17 +1,20 @@
package com.duqing.missions.ui.main.hall;
-import com.duqing.missions.base.fragments.BaseFragment;
+import com.duqing.missions.base.fragments.BaseLoadPageFragment;
+import com.duqing.missions.data.BasePageResult;
import com.duqing.missions.databinding.FragmentSubHallBinding;
+import com.duqing.missions.databinding.RefreshRecyclerBinding;
+import com.duqing.missions.ui.main.home.adapter.MissionAdapter;
/**
* Created by Administrator on 2021/11/3 0003.
*/
-public class SubHallFragment extends BaseFragment<FragmentSubHallBinding,SubHallViewModel> {
-
+public class SubHallFragment extends BaseLoadPageFragment<FragmentSubHallBinding,SubHallViewModel, MissionAdapter, BasePageResult<String>> {
@Override
public void initViews() {
-
+ super.initViews();
+ final RefreshRecyclerBinding includeRefreshRecycler = binding.includeRefreshRecycler;
}
}
diff --git a/app/src/main/java/com/duqing/missions/ui/main/home/HomeFragment.java b/app/src/main/java/com/duqing/missions/ui/main/home/HomeFragment.java
index 2b6198a..bc12d4b 100644
--- a/app/src/main/java/com/duqing/missions/ui/main/home/HomeFragment.java
+++ b/app/src/main/java/com/duqing/missions/ui/main/home/HomeFragment.java
@@ -18,8 +18,10 @@
import com.duqing.missions.data.BasePageResult;
import com.duqing.missions.databinding.FragmentHomeBinding;
import com.duqing.missions.ui.login.view.LoginActivity;
+import com.duqing.missions.ui.main.home.adapter.ClassifyAdapter;
import com.duqing.missions.ui.main.home.adapter.MissionAdapter;
import com.duqing.missions.ui.main.home.adapter.MissionTopAdapter;
+import com.duqing.missions.ui.main.home.model.Classify;
import com.duqing.missions.ui.main.home.model.MissionDesc;
import java.util.List;
@@ -39,6 +41,8 @@
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerClassify.setLayoutManager(layoutManager);
+ ClassifyAdapter classifyAdapter = new ClassifyAdapter();
+ recyclerClassify.setAdapter(classifyAdapter);
recyclerTop.setLayoutManager(new GridLayoutManager(getContext(),3));
final MissionTopAdapter topAdapter = new MissionTopAdapter();
recyclerTop.setAdapter(topAdapter);
@@ -56,6 +60,12 @@
adapter.setData(missionDescs);
}
});
+ viewModel.getClassifies().observeForever(new Observer<List<Classify>>() {
+ @Override
+ public void onChanged(List<Classify> cliassifies) {
+ classifyAdapter.setData(cliassifies);
+ }
+ });
}
@Nullable
diff --git a/app/src/main/java/com/duqing/missions/ui/main/home/HomeViewModel.java b/app/src/main/java/com/duqing/missions/ui/main/home/HomeViewModel.java
index 6852983..2627d0c 100644
--- a/app/src/main/java/com/duqing/missions/ui/main/home/HomeViewModel.java
+++ b/app/src/main/java/com/duqing/missions/ui/main/home/HomeViewModel.java
@@ -3,6 +3,7 @@
import androidx.lifecycle.MutableLiveData;
import com.duqing.missions.base.model.BaseLoadPageViewModel;
+import com.duqing.missions.ui.main.home.model.Classify;
import com.duqing.missions.ui.main.home.model.MissionDesc;
import java.util.ArrayList;
@@ -12,10 +13,15 @@
private MutableLiveData<List<MissionDesc>> topMissions = new MutableLiveData<>();
private MutableLiveData<List<MissionDesc>> recommendMissions = new MutableLiveData<>();
+ private MutableLiveData<List<Classify>> classifies = new MutableLiveData<>();
public HomeViewModel() {
}
+
+ public MutableLiveData<List<Classify>> getClassifies() {
+ return classifies;
+ }
public MutableLiveData<List<MissionDesc>> getTopMissions() {
return topMissions;
@@ -38,6 +44,12 @@
list2.clear();
list2.addAll(list);
recommendMissions.setValue(list2);
+ List<Classify> list3 = classifies.getValue() == null? new ArrayList<>() :classifies.getValue();
+ list3.add(new Classify());
+ list3.add(new Classify());
+ list3.add(new Classify());
+ list3.add(new Classify());
+ classifies.setValue(list3);
}
@Override
diff --git a/app/src/main/java/com/duqing/missions/ui/main/home/adapter/ClassifyAdapter.java b/app/src/main/java/com/duqing/missions/ui/main/home/adapter/ClassifyAdapter.java
new file mode 100644
index 0000000..fbc7604
--- /dev/null
+++ b/app/src/main/java/com/duqing/missions/ui/main/home/adapter/ClassifyAdapter.java
@@ -0,0 +1,15 @@
+package com.duqing.missions.ui.main.home.adapter;
+
+import com.duqing.missions.base.adapter.BaseAdapter;
+import com.duqing.missions.databinding.HomeItemClassifyBinding;
+import com.duqing.missions.ui.main.home.model.Classify;
+
+/**
+ * Created by Administrator on 2021/11/5 0005.
+ */
+public class ClassifyAdapter extends BaseAdapter<HomeItemClassifyBinding, Classify> {
+ @Override
+ protected void bindView(ViewBindHolder holder, Classify data, int position) {
+ holder.binding.textView.setText("Text "+position);
+ }
+}
diff --git a/app/src/main/java/com/duqing/missions/ui/main/home/adapter/MissionAdapter.java b/app/src/main/java/com/duqing/missions/ui/main/home/adapter/MissionAdapter.java
index 5626273..0584bda 100644
--- a/app/src/main/java/com/duqing/missions/ui/main/home/adapter/MissionAdapter.java
+++ b/app/src/main/java/com/duqing/missions/ui/main/home/adapter/MissionAdapter.java
@@ -1,6 +1,5 @@
package com.duqing.missions.ui.main.home.adapter;
-import com.duqing.missions.ui.main.MainActivity;
import com.duqing.missions.base.adapter.BaseAdapter;
import com.duqing.missions.databinding.HomtItemRecommendBinding;
import com.duqing.missions.ui.main.home.model.MissionDesc;
@@ -8,7 +7,7 @@
/**
* Created by Administrator on 2021/10/29 0029.
*/
-public class MissionAdapter extends BaseAdapter<HomtItemRecommendBinding, MainActivity, MissionDesc> {
+public class MissionAdapter extends BaseAdapter<HomtItemRecommendBinding, MissionDesc> {
@Override
protected void bindView(ViewBindHolder holder, MissionDesc data, int position) {
diff --git a/app/src/main/java/com/duqing/missions/ui/main/home/adapter/MissionTopAdapter.java b/app/src/main/java/com/duqing/missions/ui/main/home/adapter/MissionTopAdapter.java
index 14faafb..1944e10 100644
--- a/app/src/main/java/com/duqing/missions/ui/main/home/adapter/MissionTopAdapter.java
+++ b/app/src/main/java/com/duqing/missions/ui/main/home/adapter/MissionTopAdapter.java
@@ -1,6 +1,5 @@
package com.duqing.missions.ui.main.home.adapter;
-import com.duqing.missions.ui.main.MainActivity;
import com.duqing.missions.base.adapter.BaseAdapter;
import com.duqing.missions.databinding.HomeItemTopBinding;
import com.duqing.missions.ui.main.home.model.MissionDesc;
@@ -8,7 +7,7 @@
/**
* Created by Administrator on 2021/10/28 0028.
*/
-public class MissionTopAdapter extends BaseAdapter<HomeItemTopBinding, MainActivity, MissionDesc> {
+public class MissionTopAdapter extends BaseAdapter<HomeItemTopBinding, MissionDesc> {
@Override
diff --git a/app/src/main/java/com/duqing/missions/ui/main/home/model/Classify.java b/app/src/main/java/com/duqing/missions/ui/main/home/model/Classify.java
new file mode 100644
index 0000000..7fadf74
--- /dev/null
+++ b/app/src/main/java/com/duqing/missions/ui/main/home/model/Classify.java
@@ -0,0 +1,10 @@
+package com.duqing.missions.ui.main.home.model;
+
+/**
+ * Created by Administrator on 2021/11/5 0005.
+ */
+public class Classify {
+
+ String text,image;
+
+}
diff --git a/app/src/main/res/drawable/ic_notifications_black_24dp.xml b/app/src/main/res/drawable/ic_dynamic_black_24dp.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_notifications_black_24dp.xml
rename to app/src/main/res/drawable/ic_dynamic_black_24dp.xml
diff --git a/app/src/main/res/drawable/ic_dashboard_black_24dp.xml b/app/src/main/res/drawable/ic_hall_black_24dp.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_dashboard_black_24dp.xml
rename to app/src/main/res/drawable/ic_hall_black_24dp.xml
diff --git a/app/src/main/res/drawable/ic_mine_black_24.xml b/app/src/main/res/drawable/ic_mine_black_24.xml
new file mode 100644
index 0000000..cf7ea10
--- /dev/null
+++ b/app/src/main/res/drawable/ic_mine_black_24.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24" >
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
+</vector>
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index 60925d1..f7dfeec 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -38,7 +38,9 @@
android:layout_height="35dp"
android:drawableLeft="@mipmap/icon_search"
android:text="任务标题、编号"
- android:textColor="@color/gray"
+ android:textColor="@color/white"
+ android:drawableTint="@color/white"
+ android:backgroundTint="@color/white"
android:drawablePadding="10dp"
android:background="@drawable/trans_gray_circle"
android:gravity="center"
diff --git a/app/src/main/res/layout/fragment_sub_hall.xml b/app/src/main/res/layout/fragment_sub_hall.xml
index d95764a..2b892d9 100644
--- a/app/src/main/res/layout/fragment_sub_hall.xml
+++ b/app/src/main/res/layout/fragment_sub_hall.xml
@@ -72,6 +72,7 @@
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
<include layout="@layout/refresh_recycler"
+ android:id="@+id/include_refresh_recycler"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/view"
diff --git a/app/src/main/res/layout/home_item_classify.xml b/app/src/main/res/layout/home_item_classify.xml
index 821d1b4..6081155 100644
--- a/app/src/main/res/layout/home_item_classify.xml
+++ b/app/src/main/res/layout/home_item_classify.xml
@@ -2,19 +2,18 @@
<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_marginRight="@dimen/frame_margin_lr"
- android:layout_marginLeft="@dimen/frame_margin_lr"
- android:layout_marginTop="@dimen/frame_margin_lr"
+ android:padding="@dimen/frame_margin_lr"
android:orientation="vertical"
android:gravity="center"
- android:layout_width="match_parent"
+ android:layout_width="100dp"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_icon"
android:layout_width="50dp"
- android:layout_height="wrap_content"
+ android:layout_height="50dp"
android:adjustViewBounds="true"
+ android:scaleType="centerCrop"
tools:srcCompat="@tools:sample/avatars"/>
<TextView
diff --git a/app/src/main/res/layout/item_square.xml b/app/src/main/res/layout/item_square.xml
new file mode 100644
index 0000000..748af5f
--- /dev/null
+++ b/app/src/main/res/layout/item_square.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@drawable/bg_white_corner"
+ android:layout_marginTop="@dimen/activity_horizontal_margin"
+ android:layout_marginLeft="@dimen/activity_horizontal_margin"
+ android:layout_marginRight="@dimen/activity_horizontal_margin"
+ android:elevation="@dimen/small_radios">
+
+
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_null.xml b/app/src/main/res/layout/layout_null.xml
index beac830..9d96af7 100644
--- a/app/src/main/res/layout/layout_null.xml
+++ b/app/src/main/res/layout/layout_null.xml
@@ -1,19 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout
+<RelativeLayout
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:minHeight="400dp"
- android:layout_height="match_parent">
+ android:layout_height="wrap_content">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂无数据"
- app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintLeft_toLeftOf="parent"
- app:layout_constraintRight_toRightOf="parent"/>
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
+ android:layout_centerHorizontal="true"
+ android:layout_alignParentBottom="true"
+ android:layout_gravity="center_horizontal" />
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml
index c3f23ac..6efc980 100644
--- a/app/src/main/res/menu/bottom_nav_menu.xml
+++ b/app/src/main/res/menu/bottom_nav_menu.xml
@@ -8,12 +8,16 @@
<item
android:id="@+id/navigation_hall"
- android:icon="@drawable/ic_dashboard_black_24dp"
- android:title="@string/title_dashboard"/>
+ android:icon="@drawable/ic_hall_black_24dp"
+ android:title="@string/title_hall"/>
<item
+ android:id="@+id/navigation_dynamic"
+ android:icon="@drawable/ic_dynamic_black_24dp"
+ android:title="@string/title_dynamic"/>
+ <item
android:id="@+id/navigation_mine"
- android:icon="@drawable/ic_notifications_black_24dp"
- android:title="@string/title_notifications"/>
+ android:icon="@drawable/ic_mine_black_24"
+ android:title="@string/title_mine"/>
</menu>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 6bed2fa..eaaea45 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,8 +1,9 @@
<resources>
<string name="app_name">Missions</string>
<string name="title_home">Home</string>
- <string name="title_dashboard">Dashboard</string>
- <string name="title_notifications">Notifications</string>
+ <string name="title_hall">Hall</string>
+ <string name="title_dynamic">Dynamic</string>
+ <string name="title_mine">Mine</string>
<string name="prompt_email">Email</string>
<string name="prompt_password">Password</string>
<string name="action_sign_in">Sign in or register</string>
--
Gitblit v1.9.1