[app] Fix module list (#722)

This commit is contained in:
tehcneko 2021-06-03 03:27:41 +08:00 committed by GitHub
parent 3c2c39012e
commit 9946708dbe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 85 additions and 63 deletions

View File

@ -55,8 +55,11 @@ import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.SearchView;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.Lifecycle;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import com.bumptech.glide.request.target.CustomTarget;
@ -101,8 +104,8 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi
protected FragmentPagerBinding binding;
protected SearchView searchView;
private SearchView.OnQueryTextListener searchListener;
private final PagerAdapter pagerAdapter = new PagerAdapter();
private final ArrayList<ModuleAdapter> adapters = new ArrayList<>();
private final ArrayList<String> tabTitles = new ArrayList<>();
private ModuleUtil.InstalledModule selectedModule;
@ -138,7 +141,7 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi
binding.getRoot().bringChildToFront(binding.appBar);
setupToolbar(binding.toolbar, R.string.Modules, R.menu.menu_modules);
binding.viewPager.setAdapter(pagerAdapter);
binding.viewPager.setAdapter(new PagerAdapter(requireActivity()));
binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
@ -147,11 +150,42 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi
if (recyclerView != null) {
binding.appBar.setRaised(!recyclerView.getBorderViewDelegate().isShowingTopBorder());
}
if (position > 0) binding.fab.show();
else binding.fab.hide();
if (position > 0) {
binding.fab.show();
} else {
binding.fab.hide();
}
}
});
var users = ConfigManager.getUsers();
if (users != null) {
adapters.clear();
if (users.size() != 1) {
tabTitles.clear();
for (var user : users) {
var adapter = new ModuleAdapter(user);
adapter.setHasStableIds(true);
adapters.add(adapter);
tabTitles.add(user.name);
}
new TabLayoutMediator(binding.tabLayout, binding.viewPager, (tab, position) -> {
if (position < tabTitles.size()) {
tab.setText(tabTitles.get(position));
}
}).attach();
binding.viewPager.setUserInputEnabled(true);
binding.tabLayout.setVisibility(View.VISIBLE);
} else {
var adapter = new ModuleAdapter(null);
adapter.setHasStableIds(true);
adapters.add(adapter);
binding.viewPager.setUserInputEnabled(false);
binding.tabLayout.setVisibility(View.GONE);
}
}
binding.fab.setOnClickListener(v -> {
var pickAdaptor = new ModuleAdapter(null, true);
var position = binding.viewPager.getCurrentItem();
@ -195,31 +229,6 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi
@Override
public void onResume() {
super.onResume();
var users = ConfigManager.getUsers();
if (users != null) {
if (users.size() != adapters.size()) {
adapters.clear();
if (users.size() != 1) {
ArrayList<String> titles = new ArrayList<>();
for (var user : users) {
var adapter = new ModuleAdapter(user);
adapter.setHasStableIds(true);
adapters.add(adapter);
titles.add(user.name);
}
binding.viewPager.setUserInputEnabled(true);
new TabLayoutMediator(binding.tabLayout, binding.viewPager, (tab, position) -> tab.setText(titles.get(position))).attach();
binding.tabLayout.setVisibility(View.VISIBLE);
} else {
var adapter = new ModuleAdapter(null);
adapter.setHasStableIds(true);
adapters.add(adapter);
binding.viewPager.setUserInputEnabled(false);
binding.tabLayout.setVisibility(View.GONE);
}
pagerAdapter.notifyDataSetChanged();
}
}
adapters.forEach(ModuleAdapter::refresh);
}
@ -327,49 +336,59 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi
binding = null;
}
private class PagerAdapter extends RecyclerView.Adapter<PagerAdapter.ViewHolder> {
public static class ModuleListFragment extends Fragment {
private final int position;
private final ModulesFragment fragment;
public ModuleListFragment(int position, ModulesFragment fragment) {
this.position = position;
this.fragment = fragment;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ItemRepoRecyclerviewBinding binding = ItemRepoRecyclerviewBinding.inflate(getLayoutInflater(), container, false);
if (fragment.adapters.size() == 1) {
WindowInsetsHelperKt.setInitialPadding(binding.recyclerView, 0, ResourcesKt.resolveDimensionPixelOffset(requireActivity().getTheme(), R.attr.actionBarSize, 0), 0, 0);
}
binding.recyclerView.setTag(position);
binding.recyclerView.setAdapter(fragment.adapters.get(position));
RecyclerView.LayoutManager layoutManager = new LinearLayoutManagerFix(requireActivity());
binding.recyclerView.setLayoutManager(layoutManager);
binding.recyclerView.getBorderViewDelegate().setBorderVisibilityChangedListener((top, oldTop, bottom, oldBottom) -> fragment.binding.appBar.setRaised(!top));
binding.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE && position > 0) {
fragment.binding.fab.show();
} else {
fragment.binding.fab.hide();
}
}
});
RecyclerViewKt.fixEdgeEffect(binding.recyclerView, false, true);
RecyclerViewKt.addFastScroller(binding.recyclerView, binding.recyclerView);
return binding.getRoot();
}
}
private class PagerAdapter extends FragmentStateAdapter {
public PagerAdapter(@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
@NonNull
@Override
public PagerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new PagerAdapter.ViewHolder(ItemRepoRecyclerviewBinding.inflate(getLayoutInflater(), parent, false));
}
@Override
public void onBindViewHolder(@NonNull PagerAdapter.ViewHolder holder, int position) {
if (getItemCount() == 1) {
WindowInsetsHelperKt.setInitialPadding(holder.recyclerView, 0, ResourcesKt.resolveDimensionPixelOffset(requireActivity().getTheme(), R.attr.actionBarSize, 0), 0, 0);
}
holder.recyclerView.setTag(position);
holder.recyclerView.setAdapter(adapters.get(position));
holder.recyclerView.setLayoutManager(new LinearLayoutManagerFix(requireActivity()));
holder.recyclerView.getBorderViewDelegate().setBorderVisibilityChangedListener((top, oldTop, bottom, oldBottom) -> binding.appBar.setRaised(!top));
holder.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE && holder.getBindingAdapterPosition() > 0)
binding.fab.show();
else binding.fab.hide();
super.onScrollStateChanged(recyclerView, newState);
}
});
RecyclerViewKt.fixEdgeEffect(holder.recyclerView, false, true);
RecyclerViewKt.addFastScroller(holder.recyclerView, holder.itemView);
public Fragment createFragment(int position) {
return new ModuleListFragment(position, ModulesFragment.this);
}
@Override
public int getItemCount() {
return adapters.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
BorderRecyclerView recyclerView;
public ViewHolder(@NonNull ItemRepoRecyclerviewBinding binding) {
super(binding.getRoot());
recyclerView = binding.recyclerView;
}
}
}
private class ModuleAdapter extends EmptyStateRecyclerView.EmptyStateAdapter<ModuleAdapter.ViewHolder> implements Filterable {

View File

@ -80,7 +80,10 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:clipToPadding="false"
android:fadeScrollbars="true"
android:paddingTop="104dp"
android:scrollbarStyle="outsideOverlay"
android:scrollbars="vertical"
app:borderTopVisibility="whenTop"
app:borderTopDrawable="@null"
app:borderBottomVisibility="never"