Use recyclerview in library
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user