[mobile] dynamic itemCount for episode dialog

pull/123/head
FongMi 3 years ago
parent 213dc91ae4
commit ffafdac9bb
  1. 40
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/EpisodeDialog.java
  2. 20
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/EpisodeFragment.java
  3. 12
      app/src/mobile/res/drawable/ic_handle.xml
  4. 9
      app/src/mobile/res/layout/dialog_episode.xml

@ -13,7 +13,6 @@ import androidx.viewpager2.adapter.FragmentStateAdapter;
import com.fongmi.android.tv.bean.Vod;
import com.fongmi.android.tv.databinding.DialogEpisodeBinding;
import com.fongmi.android.tv.ui.fragment.EpisodeFragment;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.tabs.TabLayoutMediator;
import java.util.ArrayList;
@ -25,6 +24,8 @@ public class EpisodeDialog extends BaseDialog {
private DialogEpisodeBinding binding;
private final List<String> titles;
private boolean reverse;
private int spanCount;
private int itemCount;
public static EpisodeDialog create() {
return new EpisodeDialog();
@ -32,6 +33,7 @@ public class EpisodeDialog extends BaseDialog {
public EpisodeDialog() {
this.titles = new ArrayList<>();
this.spanCount = 5;
}
public EpisodeDialog reverse(boolean reverse) {
@ -41,7 +43,6 @@ public class EpisodeDialog extends BaseDialog {
public EpisodeDialog episodes(List<Vod.Flag.Episode> episodes) {
this.episodes = episodes;
setTitles();
return this;
}
@ -52,29 +53,42 @@ public class EpisodeDialog extends BaseDialog {
@Override
protected void initView() {
binding.pager.setAdapter(new PageAdapter(getActivity()));
new TabLayoutMediator(binding.tabs, binding.pager, (tab, position) -> tab.setText(titles.get(position))).attach();
setCurrentPage();
setSpanCount();
setTitles();
setPager();
}
private void setSpanCount() {
int total = 0;
for (Vod.Flag.Episode item : episodes) total += item.getName().length();
int offset = total / episodes.size();
if (offset >= 20) spanCount = 1;
else if (offset >= 10) spanCount = 2;
else if (offset >= 6) spanCount = 3;
else if (offset >= 3) spanCount = 4;
itemCount = spanCount * 10;
}
private void setTitles() {
if (reverse) for (int i = episodes.size(); i > 0; i -= 50) titles.add(i + " - " + Math.max(i - 49, 1));
else for (int i = 0; i < episodes.size(); i += 50) titles.add((i + 1) + " - " + Math.min(i + 50, episodes.size()));
if (reverse) for (int i = episodes.size(); i > 0; i -= itemCount) titles.add(i + " - " + Math.max(i - itemCount - 1, 1));
else for (int i = 0; i < episodes.size(); i += itemCount) titles.add((i + 1) + " - " + Math.min(i + itemCount, episodes.size()));
}
private void setPager() {
binding.pager.setAdapter(new PageAdapter(getActivity()));
new TabLayoutMediator(binding.tabs, binding.pager, (tab, position) -> tab.setText(titles.get(position))).attach();
setCurrentPage();
}
private void setCurrentPage() {
for (int i = 0; i < episodes.size(); i++) {
if (episodes.get(i).isActivated()) {
binding.pager.setCurrentItem(i / 50);
binding.pager.setCurrentItem(i / itemCount);
break;
}
}
}
@Override
protected void setBehavior(BottomSheetDialog dialog) {
}
class PageAdapter extends FragmentStateAdapter {
public PageAdapter(@NonNull FragmentActivity activity) {
@ -84,7 +98,7 @@ public class EpisodeDialog extends BaseDialog {
@NonNull
@Override
public Fragment createFragment(int position) {
return EpisodeFragment.newInstance(episodes.subList(position * 50, Math.min(position * 50 + 50, episodes.size())));
return EpisodeFragment.newInstance(spanCount, episodes.subList(position * itemCount, Math.min(position * itemCount + itemCount, episodes.size())));
}
@Override

@ -26,12 +26,17 @@ public class EpisodeFragment extends BaseFragment implements EpisodeAdapter.OnCl
private SiteViewModel mViewModel;
private EpisodeAdapter mAdapter;
private int getSpanCount() {
return getArguments().getInt("spanCount");
}
private String getJson() {
return getArguments().getString("json");
}
public static EpisodeFragment newInstance(List<Vod.Flag.Episode> items) {
public static EpisodeFragment newInstance(int spanCount, List<Vod.Flag.Episode> items) {
Bundle args = new Bundle();
args.putInt("spanCount", spanCount);
args.putString("json", new Gson().toJson(items));
EpisodeFragment fragment = new EpisodeFragment();
fragment.setArguments(args);
@ -62,21 +67,10 @@ public class EpisodeFragment extends BaseFragment implements EpisodeAdapter.OnCl
private void setEpisode() {
mAdapter.addAll(Vod.Flag.Episode.arrayFrom(getJson()));
mBinding.recycler.setLayoutManager(new GridLayoutManager(getContext(), getSpan(mAdapter.getItems())));
mBinding.recycler.setLayoutManager(new GridLayoutManager(getContext(), getSpanCount()));
mBinding.recycler.scrollToPosition(mAdapter.getPosition());
}
private int getSpan(List<Vod.Flag.Episode> items) {
int total = 0;
for (Vod.Flag.Episode item : items) total += item.getName().length();
int offset = total / items.size();
if (offset >= 20) return 1;
if (offset >= 10) return 2;
if (offset >= 6) return 3;
if (offset >= 3) return 4;
return 5;
}
@Override
public void onItemClick(Vod.Flag.Episode item) {
mViewModel.setEpisode(item);

@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="3dp"
android:viewportWidth="24"
android:viewportHeight="3">
<path
android:fillColor="@color/grey_300"
android:pathData="M 1.5 0 L 22.5 0 Q 24 0 24 1.5 L 24 1.5 Q 24 3 22.5 3 L 1.5 3 Q 0 3 0 1.5 L 0 1.5 Q 0 0 1.5 0 Z"
android:strokeWidth="1" />
</vector>

@ -5,18 +5,11 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:src="@drawable/ic_handle" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:text="@string/detail_episode"
android:textColor="@color/black"

Loading…
Cancel
Save