From f72921497ef65756eaefe8c24ade946ed059633f Mon Sep 17 00:00:00 2001 From: zhangyuanzhen Date: Mon, 9 Mar 2020 17:24:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=8C=87=E7=A4=BA=E5=99=A8?= =?UTF-8?q?=E6=A8=AA=E6=BB=91=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/apps/AppNavigatorFragment.java | 133 +++++++++++------ .../apps/adapter/AppIndicatorAdapter.java | 32 ++++ .../apps/adapter/base/RecycleBaseAdapter.java | 122 ++++++++++++++++ .../apps/adapter/base/RecycleViewHolder.java | 138 ++++++++++++++++++ .../module_apps_fragment_apps_navigator.xml | 40 ++--- .../layout/module_apps_item_app_indicator.xml | 26 ++++ 6 files changed, 419 insertions(+), 72 deletions(-) create mode 100644 modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/AppIndicatorAdapter.java create mode 100644 modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleBaseAdapter.java create mode 100644 modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleViewHolder.java create mode 100644 modules/mogo-module-apps/src/main/res/layout/module_apps_item_app_indicator.xml diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java index 8caeabbe1b..5813143c2b 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppNavigatorFragment.java @@ -3,12 +3,17 @@ package com.mogo.module.apps; import android.os.Bundle; import android.view.View; +import android.widget.HorizontalScrollView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearSnapHelper; +import androidx.recyclerview.widget.RecyclerView; import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.mvp.MvpFragment; +import com.mogo.module.apps.adapter.AppIndicatorAdapter; import com.mogo.module.apps.utils.LaunchUtils; import com.mogo.module.common.MogoModulePaths; import com.mogo.service.MogoServicePaths; @@ -18,6 +23,7 @@ import com.mogo.service.fragmentmanager.IMogoFragmentManager; import com.mogo.service.module.IMogoModuleProvider; import com.mogo.utils.TipToast; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -27,11 +33,9 @@ import java.util.Map; *

* 描述 */ -public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavigatorPresenter > implements AppNavigatorView { +public class AppNavigatorFragment extends MvpFragment + implements AppNavigatorView { - private View mNavigation; - private View mMediaCenter; - private View mCarSettings; private View mApps; private IMogoFragmentManager mMogoFragmentManager; @@ -42,6 +46,7 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi private IMogoModuleProvider mSearchProvider; private IMogoAnalytics mMogoAnalytics; + private RecyclerView scroller; @Override protected int getLayoutId() { @@ -51,66 +56,100 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi @Override protected void initViews() { - mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation(); + mMogoFragmentManager = (IMogoFragmentManager) ARouter.getInstance() + .build(MogoServicePaths.PATH_FRAGMENT_MANAGER) + .navigation(); - mNavigation = findViewById( R.id.module_apps_id_navigation ); - mMediaCenter = findViewById( R.id.module_apps_ic_media_center ); - mCarSettings = findViewById( R.id.module_apps_ic_car_settings ); - mApps = findViewById( R.id.module_apps_id_apps ); - mNavigation.setOnClickListener( view -> { - openSearchPanel(); - trackNavigatorClickEvent( 1 ); - } ); - mMediaCenter.setOnClickListener( view -> { - try { - LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_MUSIC ); - trackNavigatorClickEvent( 2 ); - } catch ( Exception e ) { - TipToast.shortTip( R.string.module_apps_str_no_app ); - } - } ); - mCarSettings.setOnClickListener( view -> { - try { - LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_CAR_SETTINGS ); - trackNavigatorClickEvent( 3 ); - } catch ( Exception e ) { - TipToast.shortTip( R.string.module_apps_str_no_app ); - } - } ); - mApps.setOnClickListener( view -> { + mApps = findViewById(R.id.module_apps_id_apps); + + scroller = findViewById(R.id.module_apps_id_scroller); + + LinearLayoutManager linearLayoutManager = + new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false); + + scroller.setLayoutManager(linearLayoutManager); + + ArrayList integers = new ArrayList<>(10); + + integers.add(R.drawable.module_apps_ic_navigation); + integers.add(R.drawable.module_apps_ic_media_center); + integers.add(R.drawable.module_apps_ic_car_settings); + integers.add(R.drawable.module_apps_ic_car_settings); + integers.add(R.drawable.module_apps_ic_car_settings); + + AppIndicatorAdapter appIndicatorAdapter = new AppIndicatorAdapter(getContext(), integers); + scroller.setAdapter(appIndicatorAdapter); + LinearSnapHelper snapHelper = new LinearSnapHelper(); + snapHelper.attachToRecyclerView(scroller); + + scroller.scrollToPosition(Integer.MAX_VALUE / 2); + //mNavigation.setOnClickListener( view -> { + // openSearchPanel(); + // trackNavigatorClickEvent( 1 ); + //} ); + //mMediaCenter.setOnClickListener( view -> { + // try { + // LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_MUSIC ); + // trackNavigatorClickEvent( 2 ); + // } catch ( Exception e ) { + // TipToast.shortTip( R.string.module_apps_str_no_app ); + // } + //} ); + //mCarSettings.setOnClickListener( view -> { + // try { + // LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_CAR_SETTINGS ); + // trackNavigatorClickEvent( 3 ); + // } catch ( Exception e ) { + // TipToast.shortTip( R.string.module_apps_str_no_app ); + // } + //} ); + mApps.setOnClickListener(view -> { openAppsPanel(); - trackNavigatorClickEvent( 4 ); - } ); + trackNavigatorClickEvent(4); + }); + } + + private void scrollToCenter(int index) { + } @NonNull @Override protected AppNavigatorPresenter createPresenter() { - return new AppNavigatorPresenter( this ); + return new AppNavigatorPresenter(this); } private void openSearchPanel() { - mSearchProvider = ( IMogoModuleProvider ) ARouter.getInstance().build( MogoModulePaths.PATH_MODULE_SEARCH ).navigation(); - final Fragment fragment = mSearchProvider.createFragment( getContext(), null ); - mMogoFragmentManager.push( new FragmentDescriptor.Builder().fragment( fragment ).tag( MogoModulePaths.PATH_FRAGMENT_SEARCH ).notifyMainModule( true ).build() ); + mSearchProvider = (IMogoModuleProvider) ARouter.getInstance() + .build(MogoModulePaths.PATH_MODULE_SEARCH) + .navigation(); + final Fragment fragment = mSearchProvider.createFragment(getContext(), null); + mMogoFragmentManager.push(new FragmentDescriptor.Builder().fragment(fragment) + .tag(MogoModulePaths.PATH_FRAGMENT_SEARCH) + .notifyMainModule(true) + .build()); } @Override - public void onActivityCreated( @Nullable Bundle savedInstanceState ) { - super.onActivityCreated( savedInstanceState ); - mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation( getContext() ); - mMogoAnalytics = ( IMogoAnalytics ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_ANALYTICS ).navigation( getContext() ); + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mMogoFragmentManager = (IMogoFragmentManager) ARouter.getInstance() + .build(MogoServicePaths.PATH_FRAGMENT_MANAGER) + .navigation(getContext()); + mMogoAnalytics = (IMogoAnalytics) ARouter.getInstance() + .build(MogoServicePaths.PATH_UTILS_ANALYTICS) + .navigation(getContext()); } @Override public void openAppsPanel() { - AppsListActivity.start( getActivity() ); + AppsListActivity.start(getActivity()); } - private void trackNavigatorClickEvent( int type ) { - final Map< String, Object > properties = new HashMap<>(); - properties.put( "type", type ); - mMogoAnalytics.track( "Launcher_APP_Icon", properties ); + private void trackNavigatorClickEvent(int type) { + final Map properties = new HashMap<>(); + properties.put("type", type); + mMogoAnalytics.track("Launcher_APP_Icon", properties); } @Override @@ -120,8 +159,8 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi @Override public void onDestroyView() { super.onDestroyView(); - if ( mPresenter != null ) { - mPresenter.onDestroy( getViewLifecycleOwner() ); + if (mPresenter != null) { + mPresenter.onDestroy(getViewLifecycleOwner()); } } } diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/AppIndicatorAdapter.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/AppIndicatorAdapter.java new file mode 100644 index 0000000000..3b95eaa0bc --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/AppIndicatorAdapter.java @@ -0,0 +1,32 @@ +package com.mogo.module.apps.adapter; + +import android.content.Context; +import android.view.View; +import android.widget.ImageView; +import com.mogo.module.apps.R; +import com.mogo.module.apps.adapter.base.RecycleBaseAdapter; +import com.mogo.module.apps.adapter.base.RecycleViewHolder; +import java.util.List; + +/** + * @author zyz + * 2020-03-09. + */ +public class AppIndicatorAdapter extends RecycleBaseAdapter { + /** + * + */ + public AppIndicatorAdapter(Context context, List list + ) { + super(context, list, R.layout.module_apps_item_app_indicator); + } + + @Override public int getItemCount() { + return Integer.MAX_VALUE; + } + + @Override public void onBindViewHolder(RecycleViewHolder holder, Integer integer) { + ImageView ivIndicator = holder.getView(R.id.module_apps_id_app_icon); + ivIndicator.setImageResource(integer); + } +} diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleBaseAdapter.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleBaseAdapter.java new file mode 100644 index 0000000000..2a8cc64079 --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleBaseAdapter.java @@ -0,0 +1,122 @@ +package com.mogo.module.apps.adapter.base; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; +import androidx.recyclerview.widget.RecyclerView; +import java.util.List; + +/** + *

+ * Title: adapter + *

+ *

+ * Description: + *

+ *

+ * Copyright: Copyright (c) 2015 + *

+ *

+ *

+ */ +public abstract class RecycleBaseAdapter extends + RecyclerView.Adapter +{ + + protected Context context; + protected List list; + private int resourceID; + private Toast toast; + + /** + * @param context + */ + public RecycleBaseAdapter(Context context, List list, int resourceID) + { + super(); + this.context = context; + this.list = list; + this.resourceID = resourceID; + } + + @Override + public RecycleViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) + { + View v = LayoutInflater.from(context).inflate(resourceID, viewGroup, + false); + + RecycleViewHolder holder = RecycleViewHolder + .get(v); + + initHolder(holder); + + return holder; + } + + @Override + public void onBindViewHolder( + RecycleViewHolder viewHolder, int position) + { + onBindViewHolder(viewHolder, list.get(position % list.size())); + } + + @Override + public int getItemCount() + { + return list == null ? 0 : list.size(); + } + + public abstract void onBindViewHolder( + RecycleViewHolder holder, T t); + + public void initHolder(RecycleViewHolder holder) + { + + } + public void setDatas(List list) + { + setDatas(list, false); + } + + public void setDatas(List list, boolean add) + { + if (add) + { + this.list.addAll(list); + } + else + { + this.list = list; + } + notifyDataSetChanged(); + } + public void clear(){ + if (list != null) { + list.clear(); + notifyDataSetChanged(); + } + } + public void messageShow(String mes) + { + if (toast==null){ + toast= Toast.makeText(context,mes, Toast.LENGTH_LONG); + } + else{ + toast.setText(mes); + } + toast.show(); + } + + public T getItem(int position){ + if (list==null||list.size()==0){ + return null; + } + return list.get(position); + } + + public List getList() { + return list; + } +} diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleViewHolder.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleViewHolder.java new file mode 100644 index 0000000000..58bbebbfce --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/adapter/base/RecycleViewHolder.java @@ -0,0 +1,138 @@ +package com.mogo.module.apps.adapter.base; + +import android.graphics.Bitmap; +import android.text.SpannableString; +import android.util.SparseArray; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.ImageView; +import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; + +public class RecycleViewHolder extends RecyclerView.ViewHolder { + + private SparseArray mViews; + + private View mConvertView; + + public RecycleViewHolder(View itemView) { + super(itemView); + this.mConvertView = itemView; + mViews = new SparseArray(); + // TODO Auto-generated constructor stub + } + + public static RecycleViewHolder get(View itemView) { + return new RecycleViewHolder(itemView); + } + + public View getConvertView() { + return mConvertView; + } + + public T getView(int viewId) { + View view = mViews.get(viewId); + if (view == null) { + view = mConvertView.findViewById(viewId); + mViews.put(viewId, view); + } + return (T) view; + } + + /** + * + * @param viewId + * @param text + * @return + */ + public RecycleViewHolder setText(int viewId, String text) { + TextView tv = getView(viewId); + if (tv==null)return this; + tv.setText(text); + return this; + } + + /** + * + * @param viewId + * @param text + * @return + */ + public RecycleViewHolder setText(int viewId, SpannableString text) { + TextView tv = getView(viewId); + tv.setText(text); + return this; + } + + /** + * + * @param viewId + * @param resId + * @return + */ + public RecycleViewHolder setImageResource(int viewId, int resId) { + ImageView view = getView(viewId); + view.setImageResource(resId); + return this; + } + + /** + * + * @param viewId + * @return + */ + public RecycleViewHolder setImageBitmap(int viewId, Bitmap bitmap) { + ImageView view = getView(viewId); + view.setImageBitmap(bitmap); + return this; + } + + + /** + * + * @param viewId + * @param resId + * @return + */ + // public ViewHolder setImageURI(int viewId, String url) { + // ImageView view = getView(viewId); + // // ImageLoader.getInstance.loadImg(view,url); + // return this; + // } + + /** + * + * @param viewId + * @param resId + * @return + */ + public RecycleViewHolder setBackgroundImage(int viewId, int resId) { + View view = getView(viewId); + view.setBackgroundResource(resId); + return this; + } + + /** + * + * @param viewId + * @param resId + * @return + */ + public RecycleViewHolder setTextColor(int viewId, int resId) { + TextView view = getView(viewId); + view.setTextColor(resId); + return this; + } + + /** + * + * @param viewId + * @return + */ + public RecycleViewHolder setOnClickListener(int viewId, + OnClickListener listener) { + getView(viewId).setOnClickListener(listener); + return this; + } + +} diff --git a/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps_navigator.xml b/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps_navigator.xml index 97cbe13f84..2a44855ab2 100644 --- a/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps_navigator.xml +++ b/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps_navigator.xml @@ -4,32 +4,22 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom" - android:paddingBottom="@dimen/module_apps_navigation_icon_paddingBottom"> + android:paddingBottom="@dimen/module_apps_navigation_icon_paddingBottom" + > - + + + - - - - \ No newline at end of file diff --git a/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app_indicator.xml b/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app_indicator.xml new file mode 100644 index 0000000000..8914c979ae --- /dev/null +++ b/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app_indicator.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file