package com.dozuki.ifixit.ui.search; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.dozuki.ifixit.R; import com.dozuki.ifixit.model.search.SearchResult; import com.dozuki.ifixit.model.search.SearchResults; import com.dozuki.ifixit.ui.BaseListFragment; import com.dozuki.ifixit.ui.EndlessScrollListener; import com.dozuki.ifixit.util.api.Api; import com.dozuki.ifixit.util.api.ApiCall; import java.util.ArrayList; public class SearchFragment extends BaseListFragment { private static final int LIMIT = 20; private int mOffset = 0; private static final String SEARCH_RESULTS_KEY = "SEARCH_RESULTS_KEY"; private SearchResults mSearch; private ArrayList<SearchResult> mSearchResults; private SearchAdapter mAdapter; private EndlessScrollListener mScrollListener; public static SearchFragment newInstance(SearchResults search) { Bundle args = new Bundle(); args.putSerializable(SEARCH_RESULTS_KEY, search); SearchFragment frag = new SearchFragment(); frag.setArguments(args); return frag; } public SearchFragment() { mSearchResults = new ArrayList<SearchResult>(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.search_list, container, false); Bundle args = getArguments(); if (args != null) { mSearch = (SearchResults) args.getSerializable(SEARCH_RESULTS_KEY); } else if (savedInstanceState != null) { mSearch = (SearchResults) savedInstanceState.getSerializable(SEARCH_RESULTS_KEY); } if (mSearch != null) { mSearchResults = mSearch.mResults; } mAdapter = new SearchAdapter(mSearchResults, getActivity()); setListAdapter(mAdapter); return view; } @Override public void onStart() { super.onStart(); initializeScrollListener(); } @Override public void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); state.putSerializable(SEARCH_RESULTS_KEY, mSearch); } private void initializeScrollListener() { mOffset = 0; mScrollListener = new EndlessScrollListener(getListView(), new EndlessScrollListener.RefreshList() { @Override public void onRefresh(int pageNumber) { mOffset += LIMIT; String query = ((SearchActivity) getActivity()).buildQuery(mSearch.mQuery); query += "&limit=" + LIMIT + "&offset=" + mOffset; Api.call(getActivity(), ApiCall.search(query)); } }); getListView().setOnScrollListener(mScrollListener); } public void setSearchResults(SearchResults search) { // If the new search query is different than the existing one, clear out the old search results. if (!search.mQuery.equals(mSearch.mQuery)) { mSearchResults.clear(); initializeScrollListener(); } mSearch = search; mSearchResults.addAll(search.mResults); mAdapter.setSearchResults(mSearchResults); mAdapter.notifyDataSetChanged(); if (!mSearch.mHasMoreResults) { mScrollListener.noMorePages(); } else { mScrollListener.notifyMorePages(); } getListView().invalidate(); } }