From 682c87e27d96613183e6793a806270d69f00611f Mon Sep 17 00:00:00 2001 From: kangshulong <1095887643@qq.com> Date: Fri, 13 Mar 2026 20:12:52 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=A7=A3=E5=86=B3=E4=BA=8C=E7=BA=A7=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E4=BB=8E=E5=B7=A6=E5=BE=80=E5=8F=B3=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E9=A1=B5=E9=9D=A2=E6=97=B6=EF=BC=8C=E5=BF=AB?= =?UTF-8?q?=E6=8C=89=E5=85=89=E6=A0=87=E5=BC=82=E5=B8=B8=E5=BE=98=E5=BE=8A?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/fragment/AppsFragment.java | 25 +++++++++++++++++++ .../ui/fragment/CategoryFragment.java | 4 ++- .../ui/fragment/LocalFragment.java | 24 +++++++++++++++++- .../ui/fragment/MusicFragment.java | 24 +++++++++++++++++- .../ui/fragment/RecommendFragment.java | 24 ++++++++++++++++++ .../ui/fragment/VideoFragment.java | 22 ++++++++++++++++ .../view/CustomRecyclerViewer.java | 4 +++ 7 files changed, 124 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/ik/mboxlauncher/ui/fragment/AppsFragment.java b/app/src/main/java/com/ik/mboxlauncher/ui/fragment/AppsFragment.java index 49d4aaf..cc736be 100644 --- a/app/src/main/java/com/ik/mboxlauncher/ui/fragment/AppsFragment.java +++ b/app/src/main/java/com/ik/mboxlauncher/ui/fragment/AppsFragment.java @@ -1,6 +1,7 @@ package com.ik.mboxlauncher.ui.fragment; import android.content.Intent; +import android.os.Build; import android.view.KeyEvent; import android.view.View; import android.view.ViewTreeObserver; @@ -24,6 +25,7 @@ import java.util.List; public class AppsFragment extends CategoryFragment { public static final String ACTION="com.ik.mboxlauncher.ui.fragment.AppsFragment"; private MyAppInfoAdapter mMyAppInfoAdapter = null; + private final int SCROLLPOSITION=17; @Override protected void initView(View view) { super.initView(view); @@ -59,6 +61,20 @@ public class AppsFragment extends CategoryFragment { LogUtils.loge("hasFocus===>"+hasFocus); } }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + gv_category_apps.setOnScrollChangeListener(new View.OnScrollChangeListener() { + @Override + public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { + lastFocusPositon=gv_category_apps.getmCurrentFocusPosition(); + LogUtils.loge("onScrollChange()AppsFragment pos="+lastFocusPositon); + } + }); + } + // h3翻页后gv_category_apps失去焦点处理 + if(Build.VERSION.SDK_INT<29&&disableFreshData){ + gv_category_apps.requestFocus(); + } + LogUtils.loge("AppsFragment initView==>"+disableFreshData); } @Override @@ -72,7 +88,9 @@ public class AppsFragment extends CategoryFragment { runUiThread(new Runnable() { @Override public void run() { + if(disableFreshData) return; if (data != null) { + disableFreshData=true; List appBeanList = (List) data; // 创建过滤后的列表 List filteredList = new ArrayList<>(); @@ -119,6 +137,7 @@ public class AppsFragment extends CategoryFragment { @Override public void onResumeFragment(MessageEvent event) { super.onResumeFragment(event); + disableFreshData=false; loadAppInfoByCategory(AppManager.CATEGORY_MYAPPS);//重新加载数据 LogUtils.loge("onResumeFragment===>AppsFragment"); @@ -144,11 +163,17 @@ public class AppsFragment extends CategoryFragment { @Override protected void toNextPage() { doneEvents(new MessageEvent(MusicFragment.ACTION)); + if(lastFocusPositon>SCROLLPOSITION){ + disableFreshData=false; + } } @Override protected void toPreviousPage() { doneEvents(new MessageEvent(RecommendFragment.ACTION)); + if(lastFocusPositon>SCROLLPOSITION){ + disableFreshData=false; + } } } diff --git a/app/src/main/java/com/ik/mboxlauncher/ui/fragment/CategoryFragment.java b/app/src/main/java/com/ik/mboxlauncher/ui/fragment/CategoryFragment.java index e354fc1..a46dca9 100644 --- a/app/src/main/java/com/ik/mboxlauncher/ui/fragment/CategoryFragment.java +++ b/app/src/main/java/com/ik/mboxlauncher/ui/fragment/CategoryFragment.java @@ -44,7 +44,8 @@ public abstract class CategoryFragment extends BaseFragment implements AppnetCal protected CustomAppAdapter mCustomAppAdapter=null; protected int mCategory=-1; - + protected boolean disableFreshData;//禁止再次刷新数据 + protected int lastFocusPositon;//记录焦点位置 protected static final int VIDEO_CATEGORY=0; protected static final int RECOMMEND_CATEGORY=1; @@ -248,6 +249,7 @@ public abstract class CategoryFragment extends BaseFragment implements AppnetCal private void dismissCustomApp(){ cuttentModel = MODEL_NORMAL; + disableFreshData=false; LogUtils.loge("coustom_view.getHeight():"+coustom_view.getLayoutParams().height); TranslateAnimation exitTransAnim = new TranslateAnimation(0.0f, 0.0f, 0,(float)(0 - coustom_view.getLayoutParams().height)); diff --git a/app/src/main/java/com/ik/mboxlauncher/ui/fragment/LocalFragment.java b/app/src/main/java/com/ik/mboxlauncher/ui/fragment/LocalFragment.java index 92f9c5d..1894cbb 100644 --- a/app/src/main/java/com/ik/mboxlauncher/ui/fragment/LocalFragment.java +++ b/app/src/main/java/com/ik/mboxlauncher/ui/fragment/LocalFragment.java @@ -1,6 +1,7 @@ package com.ik.mboxlauncher.ui.fragment; import android.content.Intent; +import android.os.Build; import android.view.KeyEvent; import android.view.View; import android.view.ViewTreeObserver; @@ -25,6 +26,8 @@ public class LocalFragment extends CategoryFragment { public static final String ACTION="com.ik.mboxlauncher.ui.fragment.LocalFragment"; private LocalAppAdapter mLocalAppAdapter =null; + + private final int SCROLLPOSITION=17; @Override protected void initView(View view) { mCategory=AppManager.CATEGORY_LOCAL; @@ -53,6 +56,20 @@ public class LocalFragment extends CategoryFragment { GridLayoutManager customLayoutManager = new GridLayoutManager(view.getContext(), 6); gv_category_apps.setLayoutManager(customLayoutManager); gv_category_apps.setAdapter(mLocalAppAdapter); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + gv_category_apps.setOnScrollChangeListener(new View.OnScrollChangeListener() { + @Override + public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { + lastFocusPositon=gv_category_apps.getmCurrentFocusPosition(); + LogUtils.loge("onScrollChange()LocalFragment pos="+lastFocusPositon); + } + }); + } + // h3翻页后gv_category_apps失去焦点处理 + if(Build.VERSION.SDK_INT<29&&disableFreshData){ + gv_category_apps.requestFocus(); + } + LogUtils.loge("LocalFragment initView==>"+disableFreshData); } @@ -60,7 +77,9 @@ public class LocalFragment extends CategoryFragment { @Override public void onResult(Object data) { + if(disableFreshData) return; if(data!=null){ + disableFreshData=true;//禁用再次刷新数据 collectAppMap.clear(); List appBeanList = (List) data; @@ -127,13 +146,16 @@ public class LocalFragment extends CategoryFragment { @Override protected void toPreviousPage() { doneEvents(new MessageEvent(MusicFragment.ACTION)); - + if(lastFocusPositon>SCROLLPOSITION){ + disableFreshData=false; + } } @Override public void onResumeFragment(MessageEvent event) { super.onResumeFragment(event); + disableFreshData=false; loadAppInfoByCategory(AppManager.CATEGORY_LOCAL);//重新加载数据 } diff --git a/app/src/main/java/com/ik/mboxlauncher/ui/fragment/MusicFragment.java b/app/src/main/java/com/ik/mboxlauncher/ui/fragment/MusicFragment.java index b022fd9..92370ba 100644 --- a/app/src/main/java/com/ik/mboxlauncher/ui/fragment/MusicFragment.java +++ b/app/src/main/java/com/ik/mboxlauncher/ui/fragment/MusicFragment.java @@ -1,6 +1,7 @@ package com.ik.mboxlauncher.ui.fragment; import android.content.Intent; +import android.os.Build; import android.view.KeyEvent; import android.view.View; import android.view.ViewTreeObserver; @@ -25,6 +26,7 @@ public class MusicFragment extends CategoryFragment { public static final String ACTION="com.ik.mboxlauncher.ui.fragment.MusicFragment"; private MusicAppAdapter mMusicAppAdapter; + private final int SCROLLPOSITION=17; @Override protected void initView(View view) { super.initView(view); @@ -53,6 +55,20 @@ public class MusicFragment extends CategoryFragment { GridLayoutManager customLayoutManager = new GridLayoutManager(view.getContext(), 6); gv_category_apps.setLayoutManager(customLayoutManager); gv_category_apps.setAdapter(mMusicAppAdapter); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + gv_category_apps.setOnScrollChangeListener(new View.OnScrollChangeListener() { + @Override + public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { + lastFocusPositon=gv_category_apps.getmCurrentFocusPosition(); + LogUtils.loge("onScrollChange()MusicFragment pos="+lastFocusPositon); + } + }); + } + // h3翻页后gv_category_apps失去焦点处理 + if(Build.VERSION.SDK_INT<29&&disableFreshData){ + gv_category_apps.requestFocus(); + } + LogUtils.loge("MusicFragment initView==>"+disableFreshData); } @@ -127,18 +143,24 @@ public class MusicFragment extends CategoryFragment { @Override protected void toNextPage() { doneEvents(new MessageEvent(LocalFragment.ACTION)); + if(lastFocusPositon>SCROLLPOSITION){ + disableFreshData=false; + } } @Override protected void toPreviousPage() { doneEvents(new MessageEvent(AppsFragment.ACTION)); - + if(lastFocusPositon>SCROLLPOSITION){ + disableFreshData=false; + } } @Override public void onResumeFragment(MessageEvent event) { super.onResumeFragment(event); + disableFreshData=false; loadAppInfoByCategory(AppManager.CATEGORY_MUSIC);//重新加载数据 } diff --git a/app/src/main/java/com/ik/mboxlauncher/ui/fragment/RecommendFragment.java b/app/src/main/java/com/ik/mboxlauncher/ui/fragment/RecommendFragment.java index 63ce58b..f904b1d 100644 --- a/app/src/main/java/com/ik/mboxlauncher/ui/fragment/RecommendFragment.java +++ b/app/src/main/java/com/ik/mboxlauncher/ui/fragment/RecommendFragment.java @@ -1,6 +1,7 @@ package com.ik.mboxlauncher.ui.fragment; import android.content.Intent; +import android.os.Build; import android.view.KeyEvent; import android.view.View; import android.view.ViewTreeObserver; @@ -25,6 +26,7 @@ public class RecommendFragment extends CategoryFragment { public static final String ACTION="com.ik.mboxlauncher.ui.fragment.RecommendFragment"; private RecommendAppAdapter mRecommendAppAdapter; + private final int SCROLLPOSITION=17; @Override protected void initView(View view) { mCategory=AppManager.CATEGORY_RECOMMEND; @@ -54,12 +56,28 @@ public class RecommendFragment extends CategoryFragment { GridLayoutManager customLayoutManager = new GridLayoutManager(view.getContext(), 6); gv_category_apps.setLayoutManager(customLayoutManager); gv_category_apps.setAdapter(mRecommendAppAdapter); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + gv_category_apps.setOnScrollChangeListener(new View.OnScrollChangeListener() { + @Override + public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { + lastFocusPositon=gv_category_apps.getmCurrentFocusPosition(); + LogUtils.loge("onScrollChange()RecommendFragment pos="+lastFocusPositon); + } + }); + } + // h3翻页后gv_category_apps失去焦点处理 + if(Build.VERSION.SDK_INT<29&&disableFreshData){ + gv_category_apps.requestFocus(); + } + LogUtils.loge("RecommendFragment initView==>"+disableFreshData); } @Override public void onResult(Object data) { + if(disableFreshData) return; if(data!=null){ + disableFreshData=true; collectAppMap.clear(); List appBeanList = (List) data; for (RecommendAppBean recommendAppBean:appBeanList){ @@ -126,11 +144,17 @@ public class RecommendFragment extends CategoryFragment { @Override protected void toNextPage() { doneEvents(new MessageEvent(AppsFragment.ACTION)); + if(lastFocusPositon>SCROLLPOSITION){ + disableFreshData=false; + } } @Override protected void toPreviousPage() { doneEvents(new MessageEvent(VideoFragment.ACTION)); + if(lastFocusPositon>SCROLLPOSITION){ + disableFreshData=false; + } } diff --git a/app/src/main/java/com/ik/mboxlauncher/ui/fragment/VideoFragment.java b/app/src/main/java/com/ik/mboxlauncher/ui/fragment/VideoFragment.java index 0f091b1..3650b4d 100644 --- a/app/src/main/java/com/ik/mboxlauncher/ui/fragment/VideoFragment.java +++ b/app/src/main/java/com/ik/mboxlauncher/ui/fragment/VideoFragment.java @@ -1,6 +1,7 @@ package com.ik.mboxlauncher.ui.fragment; import android.content.Intent; +import android.os.Build; import android.view.KeyEvent; import android.view.View; import android.view.ViewTreeObserver; @@ -24,6 +25,7 @@ public class VideoFragment extends CategoryFragment { public static final String ACTION="com.ik.mboxlauncher.ui.fragment.VideoFragment"; private VideoAppAdapter mVideoAppAdapter = null; + private final int SCROLLPOSITION=17; @Override protected void initView(View view) { mCategory=AppManager.CATEGORY_VIDEO; @@ -53,12 +55,28 @@ public class VideoFragment extends CategoryFragment { GridLayoutManager layoutManager = new GridLayoutManager(view.getContext(), 6); gv_category_apps.setLayoutManager(layoutManager); gv_category_apps.setAdapter(mVideoAppAdapter); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + gv_category_apps.setOnScrollChangeListener(new View.OnScrollChangeListener() { + @Override + public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { + lastFocusPositon=gv_category_apps.getmCurrentFocusPosition(); + LogUtils.loge("onScrollChange()VideoFragment pos="+lastFocusPositon); + } + }); + } + // h3翻页后gv_category_apps失去焦点处理 + if(Build.VERSION.SDK_INT<29&&disableFreshData){ + gv_category_apps.requestFocus(); + } + LogUtils.loge("VideoFragment initView==>"+disableFreshData); } @Override public void onResult(Object data) { + if(disableFreshData) return; if(data!=null){ + disableFreshData=true; collectAppMap.clear(); List appBeanList = (List) data; for (VideoAppBean videoAppBean:appBeanList){ @@ -128,6 +146,9 @@ public class VideoFragment extends CategoryFragment { @Override protected void toNextPage() { doneEvents(new MessageEvent(RecommendFragment.ACTION)); + if(lastFocusPositon>SCROLLPOSITION){ + disableFreshData=false; + } } @Override @@ -139,6 +160,7 @@ public class VideoFragment extends CategoryFragment { @Override public void onResumeFragment(MessageEvent event) { super.onResumeFragment(event); + disableFreshData=false; loadAppInfoByCategory(AppManager.CATEGORY_VIDEO);//重新加载数据 } } diff --git a/app/src/main/java/com/ik/mboxlauncher/view/CustomRecyclerViewer.java b/app/src/main/java/com/ik/mboxlauncher/view/CustomRecyclerViewer.java index a928fbe..4a79719 100644 --- a/app/src/main/java/com/ik/mboxlauncher/view/CustomRecyclerViewer.java +++ b/app/src/main/java/com/ik/mboxlauncher/view/CustomRecyclerViewer.java @@ -166,6 +166,10 @@ public class CustomRecyclerViewer extends RecyclerView { super.requestChildFocus(child, focused);//执行过super.requestChildFocus之后hasFocus会变成true mCurrentFocusPosition = getChildViewHolder(child).getAdapterPosition(); } + //获取当前焦点位置 + public int getmCurrentFocusPosition() { + return mCurrentFocusPosition; + } //实现焦点记忆的关键代码 @Override