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