Optimize recyclerview

release
jhengazuki 7 months ago
parent 23b7e498db
commit 96db12a751
  1. 20
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  2. 1
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java
  3. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java
  4. 16
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java
  5. 30
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  6. 22
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java

@ -6,6 +6,7 @@ import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -263,7 +264,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
private void setWidth(Live live) {
int padding = ResUtil.dp2px(48);
if (live.getWidth() == 0) for (Group item : live.getGroups()) live.setWidth(Math.max(live.getWidth(), ResUtil.getTextWidth(item.getName(), 16)));
mBinding.group.getLayoutParams().width = live.getWidth() == 0 ? 0 : Math.min(live.getWidth() + padding, ResUtil.getScreenWidth() / 4);
int width = live.getWidth() == 0 ? 0 : Math.min(live.getWidth() + padding, ResUtil.getScreenWidth() / 4);
setWidth(mBinding.group, width);
}
private Group setWidth(Group group) {
@ -271,8 +273,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
int padding = ResUtil.dp2px(60);
if (group.isKeep()) group.setWidth(0);
if (group.getWidth() == 0) for (Channel item : group.getChannel()) group.setWidth(Math.max(group.getWidth(), (item.getLogo().isEmpty() ? 0 : logo) + ResUtil.getTextWidth(item.getNumber() + item.getName(), 16)));
mBinding.channel.post(() -> mBinding.channel.getLayoutParams().width = group.getWidth() == 0 ? 0 : Math.min(group.getWidth() + padding, ResUtil.getScreenWidth() / 2));
mBinding.channel.post(() -> mBinding.channel.requestLayout());
int width = group.getWidth() == 0 ? 0 : Math.min(group.getWidth() + padding, ResUtil.getScreenWidth() / 2);
setWidth(mBinding.channel, width);
return group;
}
@ -281,7 +283,17 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
if (epg.getList().isEmpty()) return;
int minWidth = ResUtil.getTextWidth(epg.getList().get(0).getTime(), 16);
if (epg.getWidth() == 0) for (EpgData item : epg.getList()) epg.setWidth(Math.max(epg.getWidth(), ResUtil.getTextWidth(item.getTitle(), 16)));
mBinding.epgData.getLayoutParams().width = epg.getWidth() == 0 ? 0 : Math.min(Math.max(epg.getWidth(), minWidth) + padding, ResUtil.getScreenWidth() / 2);
int width = epg.getWidth() == 0 ? 0 : Math.min(Math.max(epg.getWidth(), minWidth) + padding, ResUtil.getScreenWidth() / 2);
setWidth(mBinding.epgData, width);
}
private void setWidth(View view, int width) {
view.post(() -> {
ViewGroup.LayoutParams params = view.getLayoutParams();
if (params.width == width) return;
params.width = width;
view.setLayoutParams(params);
});
}
private void setPosition(int[] position) {

@ -74,6 +74,7 @@ public class SearchActivity extends BaseActivity implements WordAdapter.OnClickL
else getSuggest(s.toString());
}
});
mBinding.mic.setOnClickListener(v -> mBinding.mic.start());
mBinding.mic.setListener(this, new CustomTextListener() {
@Override
public void onEndOfSpeech() {

@ -75,7 +75,7 @@ public abstract class BaseActivity extends AppCompatActivity {
}
protected void notifyItemChanged(RecyclerView view, ArrayObjectAdapter adapter) {
if (!view.isComputingLayout()) adapter.notifyArrayItemRangeChanged(0, adapter.size());
view.post(() -> adapter.notifyArrayItemRangeChanged(0, adapter.size()));
}
private void setBackCallback() {

@ -57,10 +57,12 @@ public class CustomMic extends AppCompatImageView {
}
}
private void start() {
startListening();
requestFocus();
updateUI(true);
public void start() {
PermissionUtil.requestAudio(activity, allGranted -> {
startListening();
requestFocus();
updateUI(true);
});
}
public boolean stop() {
@ -84,10 +86,8 @@ public class CustomMic extends AppCompatImageView {
@Override
protected void onFocusChanged(boolean gainFocus, int direction, @Nullable Rect previouslyFocusedRect) {
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
if (!gainFocus) stop();
else PermissionUtil.requestAudio(activity, allGranted -> {
if (allGranted) start();
});
if (gainFocus) start();
else stop();
}
@Override

@ -9,6 +9,7 @@ import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -16,6 +17,7 @@ import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.media3.common.C;
import androidx.media3.common.Player;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewbinding.ViewBinding;
import com.bumptech.glide.request.transition.Transition;
@ -270,7 +272,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener
private void setWidth(Live live) {
int padding = ResUtil.dp2px(48);
if (live.getWidth() == 0) for (Group item : live.getGroups()) live.setWidth(Math.max(live.getWidth(), ResUtil.getTextWidth(item.getName(), 14)));
mBinding.group.getLayoutParams().width = live.getWidth() == 0 ? 0 : Math.min(live.getWidth() + padding, ResUtil.getScreenWidth() / 4);
int width = live.getWidth() == 0 ? 0 : Math.min(live.getWidth() + padding, ResUtil.getScreenWidth() / 4);
setWidth(mBinding.group, width);
}
@Override
@ -279,7 +282,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener
int padding = ResUtil.dp2px(60);
if (group.isKeep()) group.setWidth(0);
if (group.getWidth() == 0) for (Channel item : group.getChannel()) group.setWidth(Math.max(group.getWidth(), (item.getLogo().isEmpty() ? 0 : logo) + ResUtil.getTextWidth(item.getNumber() + item.getName(), 14)));
mBinding.channel.getLayoutParams().width = group.getWidth() == 0 ? 0 : Math.min(group.getWidth() + padding, ResUtil.getScreenWidth() / 2);
int width = group.getWidth() == 0 ? 0 : Math.min(group.getWidth() + padding, ResUtil.getScreenWidth() / 2);
setWidth(mBinding.channel, width);
}
private void setWidth(Epg epg) {
@ -287,7 +291,15 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener
if (epg.getList().isEmpty()) return;
int minWidth = ResUtil.getTextWidth(epg.getList().get(0).getTime(), 14);
if (epg.getWidth() == 0) for (EpgData item : epg.getList()) epg.setWidth(Math.max(epg.getWidth(), ResUtil.getTextWidth(item.getTitle(), 14)));
mBinding.epgData.getLayoutParams().width = epg.getWidth() == 0 ? 0 : Math.min(Math.max(epg.getWidth(), minWidth) + padding, ResUtil.getScreenWidth() / 2);
int width = epg.getWidth() == 0 ? 0 : Math.min(Math.max(epg.getWidth(), minWidth) + padding, ResUtil.getScreenWidth() / 2);
setWidth(mBinding.epgData, width);
}
private void setWidth(View view, int width) {
ViewGroup.LayoutParams params = view.getLayoutParams();
if (params.width == width) return;
params.width = width;
view.setLayoutParams(params);
}
private void setPosition(int[] position) {
@ -308,8 +320,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener
if (change) mGroupAdapter.setSelected(position);
if (change) mChannelAdapter.addAll(mGroup.getChannel());
if (change) mChannelAdapter.setSelected(mGroup.getPosition());
mBinding.channel.scrollToPosition(mGroup.getPosition());
mBinding.group.scrollToPosition(position);
scrollToPosition(mBinding.channel, mGroup.getPosition());
scrollToPosition(mBinding.group, position);
}
private void onBack() {
@ -431,7 +443,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener
private void showEpg(Channel item) {
if (mChannel == null || mChannel.getData().getList().isEmpty() || mEpgDataAdapter.getItemCount() == 0 || !mChannel.equals(item) || !mChannel.getGroup().equals(mGroup)) return;
mBinding.epgData.scrollToPosition(item.getData().getSelected());
scrollToPosition(mBinding.epgData, item.getData().getSelected());
mBinding.epgData.setVisibility(View.VISIBLE);
mBinding.channel.setVisibility(View.GONE);
mBinding.group.setVisibility(View.GONE);
@ -544,7 +556,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener
mGroupAdapter.setSelected(mGroup = item);
mChannelAdapter.addAll(item.getChannel());
mChannelAdapter.setSelected(item.getPosition());
mBinding.channel.scrollToPosition(Math.max(item.getPosition(), 0));
scrollToPosition(mBinding.channel, Math.max(item.getPosition(), 0));
if (!item.isKeep() || ++count < 5 || mHides.isEmpty()) return;
if (Biometric.enable()) Biometric.show(this);
else PassDialog.create().show(this);
@ -925,6 +937,10 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener
this.lock = lock;
}
private void scrollToPosition(RecyclerView view, int position) {
view.post(() -> view.scrollToPosition(position));
}
@Override
public void onCasted() {
}

@ -556,7 +556,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
public void onItemClick(Flag item) {
if (item.isActivated()) return;
mFlagAdapter.setActivated(item);
mBinding.flag.scrollToPosition(mFlagAdapter.getPosition());
scrollToPosition(mBinding.flag, mFlagAdapter.getPosition());
setEpisodeAdapter(item.getEpisodes());
setQualityVisible(false);
seamless(item);
@ -566,8 +566,8 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
public void onItemClick(Episode item) {
if (shouldEnterFullscreen(item)) return;
mFlagAdapter.toggle(item);
notifyItemChanged(mEpisodeAdapter);
mBinding.episode.scrollToPosition(mEpisodeAdapter.getPosition());
notifyItemChanged(mBinding.episode, mEpisodeAdapter);
scrollToPosition(mBinding.episode, mEpisodeAdapter.getPosition());
if (isFullscreen()) Notify.show(getString(R.string.play_ready, item.getName()));
onRefresh();
}
@ -596,7 +596,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
private void setParse(Parse item) {
VodConfig.get().setParse(item);
notifyItemChanged(mParseAdapter);
notifyItemChanged(mBinding.control.parse, mParseAdapter);
if (mControlDialog != null && mControlDialog.isVisible()) mControlDialog.updateParse();
}
@ -626,7 +626,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
private void reverseEpisode(boolean scroll) {
mFlagAdapter.reverse();
setEpisodeAdapter(getFlag().getEpisodes());
if (scroll) mBinding.episode.scrollToPosition(mEpisodeAdapter.getPosition());
if (scroll) scrollToPosition(mBinding.episode, mEpisodeAdapter.getPosition());
}
private void onName() {
@ -874,7 +874,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
private void enterFullscreen() {
if (isFullscreen()) return;
if (isLand()) setTransition();
mBinding.video.postDelayed(() -> mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)), 50);
mBinding.video.postDelayed(() -> mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)), 100);
setRequestedOrientation(mPlayers.isPortrait() ? ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
mBinding.control.title.setVisibility(View.VISIBLE);
setRotate(mPlayers.isPortrait(), true);
@ -888,7 +888,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
if (!isFullscreen()) return;
if (isLand()) setTransition();
setRequestedOrientation(isPort() ? ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_FULL_USER);
mBinding.episode.postDelayed(() -> mBinding.episode.scrollToPosition(mEpisodeAdapter.getPosition()), 50);
mBinding.episode.postDelayed(() -> mBinding.episode.scrollToPosition(mEpisodeAdapter.getPosition()), 100);
mBinding.control.title.setVisibility(View.INVISIBLE);
mBinding.video.setLayoutParams(mFrameParams);
mPlayers.setDanmakuSize(0.8f);
@ -1460,8 +1460,12 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
this.lock = lock;
}
private void notifyItemChanged(RecyclerView.Adapter<?> adapter) {
adapter.notifyItemRangeChanged(0, adapter.getItemCount());
private void notifyItemChanged(RecyclerView view, RecyclerView.Adapter<?> adapter) {
view.post(() -> adapter.notifyItemRangeChanged(0, adapter.getItemCount()));
}
private void scrollToPosition(RecyclerView view, int position) {
view.post(() -> view.scrollToPosition(position));
}
@Override

Loading…
Cancel
Save