Optimize search site width

fongmi
jhengazuki 1 month ago
parent c524ac87d9
commit af33fc7df5
  1. 4
      app/src/main/java/com/fongmi/android/tv/ui/adapter/BaseDiffAdapter.java
  2. 51
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java
  3. 3
      app/src/mobile/res/layout/fragment_collect.xml

@ -55,6 +55,10 @@ public abstract class BaseDiffAdapter<T extends Diffable<T>, VH extends Recycler
else differ.submitList(newItems, () -> callback.onUpdateFinished(true));
}
public void add(T item) {
add(item, null);
}
public void add(T item, Runnable runnable) {
List<T> current = new ArrayList<>(getItems());
current.add(item);

@ -1,6 +1,5 @@
package com.fongmi.android.tv.ui.fragment;
import android.animation.ValueAnimator;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
@ -44,8 +43,7 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle
private CustomScroller mScroller;
private SiteViewModel mViewModel;
private PauseExecutor mExecutor;
private ValueAnimator mAnimator;
private int maxWidth;
private List<Site> sites;
public static CollectFragment newInstance(String keyword) {
Bundle args = new Bundle();
@ -76,11 +74,11 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle
@Override
protected void initView() {
maxWidth = ResUtil.getScreenWidth() / (getCount() + 1) - ResUtil.dp2px(32);
mScroller = new CustomScroller(this);
setRecyclerView();
setViewModel();
setAnimator();
setSites();
setWidth();
search();
}
@ -100,23 +98,25 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle
mViewModel.result.observe(this, this::setSearch);
}
private void setAnimator() {
mAnimator = new ValueAnimator();
mAnimator.addUpdateListener(animation -> {
ViewGroup.LayoutParams params = mBinding.collect.getLayoutParams();
params.width = (Integer) animation.getAnimatedValue();
mBinding.collect.setLayoutParams(params);
});
private void setSites() {
sites = new ArrayList<>();
for (Site site : VodConfig.get().getSites()) if (site.isSearchable()) sites.add(site);
}
private List<Site> getSites() {
List<Site> items = new ArrayList<>();
for (Site site : VodConfig.get().getSites()) if (site.isSearchable()) items.add(site);
return items;
private void setWidth() {
int width = 0;
int space = ResUtil.dp2px(48);
int maxWidth = ResUtil.getScreenWidth() / (getCount() + 1) - ResUtil.dp2px(32);
for (Site site : sites) width = Math.max(width, ResUtil.getTextWidth(site.getName(), 14));
int contentWidth = width + space;
int minWidth = ResUtil.dp2px(120);
int finalWidth = Math.max(minWidth, Math.min(contentWidth, maxWidth));
ViewGroup.LayoutParams params = mBinding.collect.getLayoutParams();
params.width = finalWidth;
mBinding.collect.setLayoutParams(params);
}
private void search() {
List<Site> sites = getSites();
if (sites.isEmpty()) return;
if (mExecutor != null) mExecutor.shutdownNow();
mExecutor = new PauseExecutor(20, sites.size());
@ -141,25 +141,10 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle
private void setCollect(Result result) {
if (result == null) return;
if (mCollectAdapter.getPosition() == 0) mSearchAdapter.addAll(result.getList());
mCollectAdapter.add(Collect.create(result.getList()), this::setWidth);
mCollectAdapter.add(Collect.create(result.getList()));
mCollectAdapter.add(result.getList());
}
private void setWidth() {
int maxTextWidth = 0;
int space = ResUtil.dp2px(48);
for (Collect item : mCollectAdapter.getItems()) maxTextWidth = Math.max(maxTextWidth, ResUtil.getTextWidth(item.getSite().getName(), 14));
int contentWidth = maxTextWidth + space;
int minWidth = ResUtil.dp2px(120);
int finalWidth = Math.max(minWidth, Math.min(contentWidth, maxWidth));
int startWidth = mBinding.collect.getWidth();
if (finalWidth == startWidth) return;
if (mAnimator.isRunning()) mAnimator.cancel();
mAnimator.setIntValues(startWidth, finalWidth);
mAnimator.setDuration(300);
mAnimator.start();
}
private void setSearch(Result result) {
if (result == null) return;
boolean same = !result.getList().isEmpty() && mCollectAdapter.getActivated().getSite().equals(result.getList().get(0).getSite());

@ -20,12 +20,11 @@
<com.fongmi.android.tv.ui.custom.CustomRecyclerView
android:id="@+id/collect"
android:layout_width="wrap_content"
android:layout_width="120dp"
android:layout_height="match_parent"
android:layout_marginTop="-8dp"
android:clipChildren="false"
android:clipToPadding="false"
android:minWidth="120dp"
android:overScrollMode="never"
android:paddingStart="8dp"
android:paddingEnd="0dp"

Loading…
Cancel
Save