Support filter collapse

pull/21/head
FongMi 4 years ago
parent e4f1fae1a0
commit b4fe34aa8a
  1. 39
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java
  2. 32
      app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java
  3. 4
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/TypePresenter.java
  4. 13
      app/src/leanback/res/drawable/ic_filter_off.xml
  5. 10
      app/src/leanback/res/drawable/ic_filter_on.xml
  6. 10
      app/src/main/java/com/fongmi/android/tv/bean/Class.java

@ -32,6 +32,8 @@ public class VodActivity extends BaseActivity {
private ActivityVodBinding mBinding;
private TypePresenter mTypePresenter;
private ArrayObjectAdapter mAdapter;
private PageAdapter mPageAdapter;
private Result mResult;
private View mOldView;
@ -54,14 +56,13 @@ public class VodActivity extends BaseActivity {
@Override
protected void initView() {
mResult = Result.fromJson(getResult());
sortCategories();
setRecyclerView();
setPager();
setTypes();
}
@Override
protected void initEvent() {
mTypePresenter.setOnClickListener((item) -> mBinding.pager.setCurrentItem(mResult.getTypes().indexOf(item)));
mBinding.pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
@ -78,25 +79,39 @@ public class VodActivity extends BaseActivity {
mOldView.setActivated(true);
}
});
mTypePresenter.setOnClickListener(item -> {
int index = mResult.getTypes().indexOf(item);
if (index != mBinding.pager.getCurrentItem()) mBinding.pager.setCurrentItem(index);
else item.setFilter(item.getFilter() == null ? null : !item.getFilter());
if (item.getFilter() != null) updateFilter(item.getFilter());
});
}
private void sortCategories() {
private void setRecyclerView() {
mBinding.recycler.setHorizontalSpacing(ResUtil.dp2px(16));
mBinding.recycler.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(mTypePresenter = new TypePresenter())));
}
private void setPager() {
mBinding.pager.setAdapter(mPageAdapter = new PageAdapter(getSupportFragmentManager()));
}
private void setTypes() {
List<Class> newTypes = new ArrayList<>();
for (String cate : ApiConfig.get().getHome().getCategories()) for (Class type : mResult.getTypes()) if (cate.equals(type.getTypeName())) newTypes.add(type);
if (newTypes.size() > 0) mResult.setTypes(newTypes);
for (Class type : mResult.getTypes()) if (mResult.getFilters().containsKey(type.getTypeId())) type.setFilter(false);
mAdapter.setItems(mResult.getTypes(), null);
}
private void setRecyclerView() {
mBinding.recycler.setHorizontalSpacing(ResUtil.dp2px(16));
mBinding.recycler.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
ArrayObjectAdapter adapter = new ArrayObjectAdapter(mTypePresenter = new TypePresenter());
adapter.addAll(0, mResult.getTypes());
ItemBridgeAdapter bridgeAdapter = new ItemBridgeAdapter(adapter);
mBinding.recycler.setAdapter(bridgeAdapter);
private void updateFilter(boolean filter) {
mAdapter.notifyArrayItemRangeChanged(0, mAdapter.size());
getVodFragment().toggleFilter(filter);
}
private void setPager() {
mBinding.pager.setAdapter(new PageAdapter(getSupportFragmentManager()));
private VodFragment getVodFragment() {
return (VodFragment) mPageAdapter.instantiateItem(mBinding.pager, mBinding.pager.getCurrentItem());
}
class PageAdapter extends FragmentStatePagerAdapter {

@ -73,7 +73,6 @@ public class VodFragment extends Fragment implements CustomScroller.Callback, Vo
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
setRecyclerView();
setViewModel();
setFilter();
getVideo();
}
@ -95,16 +94,6 @@ public class VodFragment extends Fragment implements CustomScroller.Callback, Vo
});
}
private void setFilter() {
for (Filter filter : mFilters) {
FilterPresenter presenter = new FilterPresenter(filter.getKey());
ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenter);
presenter.setOnClickListener((key, item) -> setClick(adapter, key, item));
adapter.addAll(0, filter.getValue());
mAdapter.add(new ListRow(adapter));
}
}
private void setClick(ArrayObjectAdapter adapter, String key, Filter.Value item) {
if (mExtend.get(key) != null && Objects.equals(mExtend.get(key), item.getV())) return;
for (int i = 0; i < adapter.size(); i++) ((Filter.Value) adapter.get(i)).setActivated(item);
@ -135,6 +124,27 @@ public class VodFragment extends Fragment implements CustomScroller.Callback, Vo
mAdapter.addAll(mAdapter.size(), rows);
}
private void addFilter() {
List<ListRow> rows = new ArrayList<>();
for (Filter filter : mFilters) {
FilterPresenter presenter = new FilterPresenter(filter.getKey());
ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenter);
presenter.setOnClickListener((key, item) -> setClick(adapter, key, item));
adapter.addAll(0, filter.getValue());
rows.add(new ListRow(adapter));
}
mAdapter.addAll(0, rows);
}
public void toggleFilter(boolean open) {
if (open) {
addFilter();
mBinding.recycler.postDelayed(() -> mBinding.recycler.smoothScrollToPosition(0), 50);
} else {
mAdapter.removeItems(0, mFilters.size());
}
}
@Override
public void onItemClick(Vod item) {
DetailActivity.start(getActivity(), item.getVodId());

@ -6,8 +6,10 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.leanback.widget.Presenter;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.bean.Class;
import com.fongmi.android.tv.databinding.AdapterTypeBinding;
import com.fongmi.android.tv.utils.ResUtil;
public class TypePresenter extends Presenter {
@ -31,6 +33,8 @@ public class TypePresenter extends Presenter {
Class item = (Class) object;
ViewHolder holder = (ViewHolder) viewHolder;
holder.binding.text.setText(item.getTypeName());
holder.binding.text.setCompoundDrawablePadding(ResUtil.dp2px(4));
holder.binding.text.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, item.getFilter() == null ? 0 : item.getFilter() ? R.drawable.ic_filter_off : R.drawable.ic_filter_on, 0);
setOnClickListener(holder, view -> mListener.onItemClick(item));
}

@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="18dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M19.79,5.61C20.3,4.95 19.83,4 19,4H6.83l7.97,7.97L19.79,5.61z" />
<path
android:fillColor="@android:color/white"
android:pathData="M2.81,2.81L1.39,4.22L10,13v6c0,0.55 0.45,1 1,1h2c0.55,0 1,-0.45 1,-1v-2.17l5.78,5.78l1.41,-1.41L2.81,2.81z" />
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="18dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M4.25,5.61C6.27,8.2 10,13 10,13v6c0,0.55 0.45,1 1,1h2c0.55,0 1,-0.45 1,-1v-6c0,0 3.72,-4.8 5.74,-7.39C20.25,4.95 19.78,4 18.95,4H5.04C4.21,4 3.74,4.95 4.25,5.61z" />
</vector>

@ -17,6 +17,8 @@ public class Class {
@SerializedName("type_name")
private String typeName;
private Boolean filter;
public String getTypeId() {
return typeId;
}
@ -25,6 +27,14 @@ public class Class {
return typeName;
}
public void setFilter(Boolean filter) {
this.filter = filter;
}
public Boolean getFilter() {
return filter;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;

Loading…
Cancel
Save