package moe.feng.nhentai.ui.fragment; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import java.util.ArrayList; import moe.feng.nhentai.R; import moe.feng.nhentai.api.PageApi; import moe.feng.nhentai.dao.FavoritesManager; import moe.feng.nhentai.model.BaseMessage; import moe.feng.nhentai.model.Book; import moe.feng.nhentai.ui.BookDetailsActivity; import moe.feng.nhentai.ui.adapter.BookListRecyclerAdapter; import moe.feng.nhentai.ui.common.AbsRecyclerViewAdapter; import moe.feng.nhentai.ui.common.LazyFragment; import moe.feng.nhentai.util.AsyncTask; import moe.feng.nhentai.util.Settings; import moe.feng.nhentai.util.Utility; public class PageListFragment extends LazyFragment { private FavoritesManager mFM; private RecyclerView mRecyclerView; private BookListRecyclerAdapter mAdapter; private StaggeredGridLayoutManager mLayoutManager; private SwipeRefreshLayout mSwipeRefreshLayout; private ArrayList<Book> mBooks; private int mNowPage = 1, mHorCardCount = 2; private boolean isAllowToLoadNextPage = true; private static final int MSG_CODE_NO_MORE_RESULTS = 1; private static final String ARG_PAGE_URL = "args_page_url"; public static PageListFragment newInstance(String pageUrl) { PageListFragment fragment = new PageListFragment(); Bundle args = new Bundle(); args.putString(ARG_PAGE_URL, pageUrl); fragment.setArguments(args); fragment.setHasOptionsMenu(true); return fragment; } @Override public int getLayoutResId() { return R.layout.fragment_category_page; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void finishCreateView(Bundle state) { mFM = FavoritesManager.getInstance(getApplicationContext()); mRecyclerView = $(R.id.recycler_view); mSwipeRefreshLayout = $(R.id.swipe_refresh_layout); if ((mHorCardCount = mSets.getInt(Settings.KEY_CARDS_COUNT, -1)) < 1) { mHorCardCount = Utility.getHorizontalCardCountInScreen(getApplicationContext()); } mLayoutManager = new StaggeredGridLayoutManager(mHorCardCount, StaggeredGridLayoutManager.VERTICAL); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setHasFixedSize(true); mBooks = new ArrayList<>(); mAdapter = new BookListRecyclerAdapter(mRecyclerView, mBooks, mFM, mSets); setRecyclerViewAdapter(mAdapter); mSwipeRefreshLayout.setColorSchemeResources( R.color.deep_purple_500, R.color.pink_500, R.color.orange_500, R.color.brown_500, R.color.indigo_500, R.color.blue_500, R.color.teal_500, R.color.green_500 ); mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { if (!mSwipeRefreshLayout.isRefreshing()) { mSwipeRefreshLayout.setRefreshing(true); } isAllowToLoadNextPage = true; mBooks = new ArrayList<>(); mAdapter = new BookListRecyclerAdapter(mRecyclerView, mBooks, mFM, mSets); setRecyclerViewAdapter(mAdapter); mNowPage=1; new PageGetTask().execute(mNowPage); } }); mSwipeRefreshLayout.setRefreshing(true); new PageGetTask().execute(mNowPage); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_load_next_page) { mSwipeRefreshLayout.setRefreshing(true); new PageGetTask().execute(++mNowPage); return true; } return super.onOptionsItemSelected(item); } private void setRecyclerViewAdapter(BookListRecyclerAdapter adapter) { adapter.setOnItemClickListener(new AbsRecyclerViewAdapter.OnItemClickListener() { @Override public void onItemClick(int position, AbsRecyclerViewAdapter.ClickableViewHolder viewHolder) { BookListRecyclerAdapter.ViewHolder holder = (BookListRecyclerAdapter.ViewHolder) viewHolder; BookDetailsActivity.launch(getActivity(), holder.mPreviewImageView, holder.book, position); } }); adapter.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView rv, int dx, int dy) { if (!mSwipeRefreshLayout.isRefreshing() && mLayoutManager.findLastCompletelyVisibleItemPositions(new int[mHorCardCount])[0] >= mAdapter.getItemCount() - 2) { if (!isAllowToLoadNextPage) return; mSwipeRefreshLayout.setRefreshing(true); new PageGetTask().execute(++mNowPage); } } }); if (mRecyclerView.getAdapter()== null){ Log.d("Me", "set"); mRecyclerView.setAdapter(adapter); } else{ Log.d("Me", "swap"); mRecyclerView.swapAdapter(adapter, false); } } private class PageGetTask extends AsyncTask<Integer, Void, BaseMessage> { @Override protected BaseMessage doInBackground(Integer... params) { mFM.reload(getApplicationContext()); Log.d("Hey", "doInBackground: " + getArguments().getString(ARG_PAGE_URL) + "&page=" + mNowPage); BaseMessage msg = PageApi.getPageList(getArguments().getString(ARG_PAGE_URL) + "&page=" + mNowPage); if (msg.getCode() == 0 && msg.getData() != null) { ArrayList<Book> temp = msg.getData(); if (temp.isEmpty()) { msg.setCode(MSG_CODE_NO_MORE_RESULTS); } else { Book firstBook = temp.get(0); boolean hasExist = false; for (int i = 0; i < mBooks.size() && !hasExist; i++) { hasExist = mBooks.get(i).bookId.equals(firstBook.bookId); } if (hasExist && !mSwipeRefreshLayout.isRefreshing()) { msg.setCode(MSG_CODE_NO_MORE_RESULTS); } } } return msg; } @Override protected void onPostExecute(BaseMessage msg) { mSwipeRefreshLayout.setRefreshing(false); if (msg != null) { switch (msg.getCode()) { case 0: if (msg.getData() != null) { ArrayList<Book> mArray = msg.getData(); if (!mArray.isEmpty()) { if (mNowPage ==1) { mBooks.clear(); } mBooks.addAll(mArray); mAdapter.notifyDataSetChanged(); if (mNowPage == 1) { isAllowToLoadNextPage = true; BookListRecyclerAdapter newAdapter = new BookListRecyclerAdapter(mRecyclerView, mBooks, mFM, mSets); setRecyclerViewAdapter(newAdapter); } else{ mRecyclerView.getAdapter().notifyDataSetChanged(); } } else { Snackbar.make(mRecyclerView, R.string.tips_no_result, Snackbar.LENGTH_LONG).show(); } } break; case MSG_CODE_NO_MORE_RESULTS: isAllowToLoadNextPage = false; Snackbar.make(mRecyclerView, R.string.tips_no_more_results, Snackbar.LENGTH_LONG).show(); break; default: if (mNowPage == 1) { Snackbar.make( mRecyclerView, R.string.tips_network_error, Snackbar.LENGTH_LONG ).setAction( R.string.snack_action_try_again, new View.OnClickListener() { @Override public void onClick(View view) { mSwipeRefreshLayout.setRefreshing(true); new PageGetTask().execute(mNowPage); } } ).show(); } } } } } }