Use recyclerview in library

This commit is contained in:
inorichi
2015-12-26 21:54:10 +01:00
parent 043ab7eca9
commit 1c86828b65
12 changed files with 286 additions and 181 deletions
@@ -1,34 +1,71 @@
package eu.kanade.mangafeed.ui.library;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import java.util.ArrayList;
import java.util.List;
import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.kanade.mangafeed.R;
import eu.kanade.mangafeed.data.database.models.Manga;
import eu.kanade.mangafeed.ui.main.MainActivity;
import rx.Observable;
import uk.co.ribot.easyadapter.EasyAdapter;
public class LibraryCategoryAdapter extends EasyAdapter<Manga> implements Filterable {
public class LibraryCategoryAdapter extends FlexibleAdapter<LibraryHolder, Manga>
implements Filterable {
List<Manga> mangas;
Filter filter;
private LibraryPresenter presenter;
private LibraryCategoryFragment fragment;
public LibraryCategoryAdapter(MainActivity activity) {
super(activity, LibraryHolder.class);
public LibraryCategoryAdapter(LibraryCategoryFragment fragment) {
this.fragment = fragment;
mItems = new ArrayList<>();
filter = new LibraryFilter();
presenter = ((LibraryFragment) activity.getActiveFragment()).getPresenter();
setHasStableIds(true);
}
public void setNewItems(List<Manga> list) {
super.setItems(list);
public void setItems(List<Manga> list) {
mItems = list;
notifyDataSetChanged();
// TODO needed for filtering?
mangas = list;
}
public void clear() {
mItems.clear();
}
@Override
public long getItemId(int position) {
return mItems.get(position).id;
}
@Override
public void updateDataSet(String param) {
}
@Override
public LibraryHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(fragment.getActivity()).inflate(R.layout.item_catalogue, parent, false);
return new LibraryHolder(v, this, fragment);
}
@Override
public void onBindViewHolder(LibraryHolder holder, int position) {
final LibraryPresenter presenter = ((LibraryFragment) fragment.getParentFragment()).getPresenter();
final Manga manga = getItem(position);
holder.onSetValues(manga, presenter);
//When user scrolls this bind the correct selection status
holder.itemView.setActivated(isSelected(position));
}
@Override
public Filter getFilter() {
return filter;
@@ -65,12 +102,4 @@ public class LibraryCategoryAdapter extends EasyAdapter<Manga> implements Filter
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
LibraryHolder holder = (LibraryHolder) view.getTag();
Manga manga = getItem(position);
holder.loadCover(manga, presenter.sourceManager.get(manga.source), presenter.coverCache);
return view;
}
}
@@ -2,33 +2,41 @@ package eu.kanade.mangafeed.ui.library;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.view.ActionMode;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnItemClick;
import eu.kanade.mangafeed.R;
import eu.kanade.mangafeed.data.database.models.Category;
import eu.kanade.mangafeed.data.database.models.Manga;
import eu.kanade.mangafeed.event.LibraryMangasEvent;
import eu.kanade.mangafeed.ui.base.activity.BaseActivity;
import eu.kanade.mangafeed.ui.base.adapter.FlexibleViewHolder;
import eu.kanade.mangafeed.ui.base.fragment.BaseFragment;
import eu.kanade.mangafeed.ui.main.MainActivity;
import eu.kanade.mangafeed.ui.manga.MangaActivity;
import eu.kanade.mangafeed.util.EventBusHook;
import icepick.Icepick;
import icepick.State;
public class LibraryCategoryFragment extends BaseFragment {
public class LibraryCategoryFragment extends BaseFragment implements
ActionMode.Callback, FlexibleViewHolder.OnListItemClickListener {
@Bind(R.id.gridView) GridView grid;
@Bind(R.id.library_mangas) RecyclerView recycler;
protected LibraryCategoryAdapter adapter;
@State Category category;
private LibraryCategoryAdapter adapter;
private ActionMode actionMode;
private static final int INVALID_POSITION = -1;
public static LibraryCategoryFragment newInstance(Category category) {
LibraryCategoryFragment fragment = new LibraryCategoryFragment();
@@ -43,8 +51,11 @@ public class LibraryCategoryFragment extends BaseFragment {
ButterKnife.bind(this, view);
Icepick.restoreInstanceState(this, savedState);
adapter = new LibraryCategoryAdapter((MainActivity) getActivity());
grid.setAdapter(adapter);
recycler.setHasFixedSize(true);
recycler.setLayoutManager(new GridLayoutManager(getActivity(), 4));
adapter = new LibraryCategoryAdapter(this);
recycler.setAdapter(adapter);
return view;
}
@@ -72,21 +83,75 @@ public class LibraryCategoryFragment extends BaseFragment {
setMangas(event.getMangas().get(category.id));
}
@OnItemClick(R.id.gridView)
protected void onMangaClick(int position) {
Intent intent = MangaActivity.newIntent(
getActivity(),
adapter.getItem(position)
);
protected void openManga(Manga manga) {
Intent intent = MangaActivity.newIntent(getActivity(), manga);
getActivity().startActivity(intent);
}
public void setMangas(List<Manga> mangas) {
if (mangas != null) {
adapter.setNewItems(mangas);
adapter.setItems(mangas);
} else {
adapter.getItems().clear();
adapter.clear();
}
}
@Override
public boolean onListItemClick(int position) {
if (actionMode != null && position != INVALID_POSITION) {
toggleSelection(position);
return true;
} else {
openManga(adapter.getItem(position));
return false;
}
}
@Override
public void onListItemLongClick(int position) {
if (actionMode == null)
actionMode = ((BaseActivity) getActivity()).startSupportActionMode(this);
toggleSelection(position);
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.library_selection, menu);
adapter.setMode(LibraryCategoryAdapter.MODE_MULTI);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
adapter.setMode(LibraryCategoryAdapter.MODE_SINGLE);
adapter.clearSelection();
actionMode = null;
}
private void toggleSelection(int position) {
adapter.toggleSelection(position, false);
int count = adapter.getSelectedItemCount();
if (count == 0) {
actionMode.finish();
} else {
setContextTitle(count);
actionMode.invalidate();
}
}
private void setContextTitle(int count) {
actionMode.setTitle(getString(R.string.selected_chapters_title, count));
}
}
@@ -4,31 +4,28 @@ import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import butterknife.Bind;
import butterknife.ButterKnife;
import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.kanade.mangafeed.R;
import eu.kanade.mangafeed.data.cache.CoverCache;
import eu.kanade.mangafeed.data.database.models.Manga;
import eu.kanade.mangafeed.data.source.base.Source;
import uk.co.ribot.easyadapter.ItemViewHolder;
import uk.co.ribot.easyadapter.PositionInfo;
import uk.co.ribot.easyadapter.annotations.LayoutId;
import uk.co.ribot.easyadapter.annotations.ViewId;
import eu.kanade.mangafeed.ui.base.adapter.FlexibleViewHolder;
public class LibraryHolder extends FlexibleViewHolder {
@LayoutId(R.layout.item_catalogue)
public class LibraryHolder extends ItemViewHolder<Manga> {
@Bind(R.id.thumbnail) ImageView thumbnail;
@Bind(R.id.title) TextView title;
@Bind(R.id.unreadText) TextView unreadText;
@ViewId(R.id.thumbnail) ImageView thumbnail;
@ViewId(R.id.title) TextView title;
@ViewId(R.id.author) TextView author;
@ViewId(R.id.unreadText) TextView unreadText;
public LibraryHolder(View view) {
super(view);
public LibraryHolder(View view, FlexibleAdapter adapter, OnListItemClickListener listener) {
super(view, adapter, listener);
ButterKnife.bind(this, view);
}
public void onSetValues(Manga manga, PositionInfo positionInfo) {
public void onSetValues(Manga manga, LibraryPresenter presenter) {
title.setText(manga.title);
author.setText(manga.author);
if (manga.unread > 0) {
unreadText.setVisibility(View.VISIBLE);
@@ -36,9 +33,11 @@ public class LibraryHolder extends ItemViewHolder<Manga> {
} else {
unreadText.setVisibility(View.GONE);
}
loadCover(manga, presenter.sourceManager.get(manga.source), presenter.coverCache);
}
public void loadCover(Manga manga, Source source, CoverCache coverCache) {
private void loadCover(Manga manga, Source source, CoverCache coverCache) {
if (manga.thumbnail_url != null) {
coverCache.saveAndLoadFromCache(thumbnail, manga.thumbnail_url, source.getGlideHeaders());
} else {