Java tutorial
/** * Copyright 2016 JustWayward Team * <p> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.justwayward.reader.ui.activity; import android.content.Context; import android.content.Intent; import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.ListPopupWindow; import android.support.v7.widget.SearchView; import android.text.TextUtils; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.TextView; import com.justwayward.reader.R; import com.justwayward.reader.base.BaseRVActivity; import com.justwayward.reader.bean.SearchDetail; import com.justwayward.reader.component.AppComponent; import com.justwayward.reader.component.DaggerBookComponent; import com.justwayward.reader.manager.CacheManager; import com.justwayward.reader.ui.adapter.AutoCompleteAdapter; import com.justwayward.reader.ui.adapter.SearchHistoryAdapter; import com.justwayward.reader.ui.contract.SearchContract; import com.justwayward.reader.ui.easyadapter.SearchAdapter; import com.justwayward.reader.ui.presenter.SearchPresenter; import com.justwayward.reader.view.TagColor; import com.justwayward.reader.view.TagGroup; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.inject.Inject; import butterknife.Bind; import butterknife.OnClick; /** * Created by Administrator on 2016/8/6. */ public class SearchActivity extends BaseRVActivity<SearchDetail.SearchBooks> implements SearchContract.View { public static final String INTENT_QUERY = "query"; public static void startActivity(Context context, String query) { context.startActivity(new Intent(context, SearchActivity.class).putExtra(INTENT_QUERY, query)); } @Bind(R.id.tvChangeWords) TextView mTvChangeWords; @Bind(R.id.tag_group) TagGroup mTagGroup; @Bind(R.id.rootLayout) LinearLayout mRootLayout; @Bind(R.id.layoutHotWord) RelativeLayout mLayoutHotWord; @Bind(R.id.rlHistory) RelativeLayout rlHistory; @Bind(R.id.tvClear) TextView tvClear; @Bind(R.id.lvSearchHistory) ListView lvSearchHistory; @Inject SearchPresenter mPresenter; private List<String> tagList = new ArrayList<>(); private int times = 0; private AutoCompleteAdapter mAutoAdapter; private List<String> mAutoList = new ArrayList<>(); private SearchHistoryAdapter mHisAdapter; private List<String> mHisList = new ArrayList<>(); private String key; private MenuItem searchMenuItem; private SearchView searchView; private ListPopupWindow mListPopupWindow; int hotIndex = 0; @Override public int getLayoutId() { return R.layout.activity_search; } @Override protected void setupActivityComponent(AppComponent appComponent) { DaggerBookComponent.builder().appComponent(appComponent).build().inject(this); } @Override public void initToolBar() { mCommonToolbar.setTitle(""); mCommonToolbar.setNavigationIcon(R.drawable.ab_back); } @Override public void initDatas() { key = getIntent().getStringExtra(INTENT_QUERY); mHisAdapter = new SearchHistoryAdapter(this, mHisList); lvSearchHistory.setAdapter(mHisAdapter); lvSearchHistory.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { search(mHisList.get(position)); } }); initSearchHistory(); } @Override public void configViews() { initAdapter(SearchAdapter.class, false, false); initAutoList(); mTagGroup.setOnTagClickListener(new TagGroup.OnTagClickListener() { @Override public void onTagClick(String tag) { search(tag); } }); mTvChangeWords.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showHotWord(); } }); mPresenter.attachView(this); mPresenter.getHotWordList(); } private void initAutoList() { mAutoAdapter = new AutoCompleteAdapter(this, mAutoList); mListPopupWindow = new ListPopupWindow(this); mListPopupWindow.setAdapter(mAutoAdapter); mListPopupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); mListPopupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); mListPopupWindow.setAnchorView(mCommonToolbar); mListPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mListPopupWindow.dismiss(); TextView tv = (TextView) view.findViewById(R.id.tvAutoCompleteItem); String str = tv.getText().toString(); search(str); } }); } @Override public synchronized void showHotWordList(List<String> list) { visible(mTvChangeWords); tagList.clear(); tagList.addAll(list); times = 0; showHotWord(); } /** * ?8?? */ private synchronized void showHotWord() { int tagSize = 8; String[] tags = new String[tagSize]; for (int j = 0; j < tagSize && j < tagList.size(); hotIndex++, j++) { tags[j] = tagList.get(hotIndex % tagList.size()); } List<TagColor> colors = TagColor.getRandomColors(tagSize); mTagGroup.setTags(colors, tags); } @Override public void showAutoCompleteList(List<String> list) { mAutoList.clear(); mAutoList.addAll(list); if (!mListPopupWindow.isShowing()) { mListPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); mListPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); mListPopupWindow.show(); } mAutoAdapter.notifyDataSetChanged(); } @Override public void showSearchResultList(List<SearchDetail.SearchBooks> list) { mAdapter.clear(); mAdapter.addAll(list); mAdapter.notifyDataSetChanged(); initSearchResult(); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_search, menu); searchMenuItem = menu.findItem(R.id.action_search);//??item searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { key = query; mPresenter.getSearchResultList(query); saveSearchHistory(query); return false; } @Override public boolean onQueryTextChange(String newText) { if (TextUtils.isEmpty(newText)) { if (mListPopupWindow.isShowing()) mListPopupWindow.dismiss(); initTagGroup(); } else { mPresenter.getAutoCompleteList(newText); } return false; } }); search(key); // ???? MenuItemCompat.setOnActionExpandListener(searchMenuItem, new MenuItemCompat.OnActionExpandListener() {//? @Override public boolean onMenuItemActionExpand(MenuItem item) { return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { initTagGroup(); return true; } }); return true; } /** * ??.????20? * * @param query */ private void saveSearchHistory(String query) { List<String> list = CacheManager.getInstance().getSearchHistory(); if (list == null) { list = new ArrayList<>(); list.add(query); } else { Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if (TextUtils.equals(query, item)) { iterator.remove(); } } list.add(0, query); } int size = list.size(); if (size > 20) { // ?20? for (int i = size - 1; i >= 20; i--) { list.remove(i); } } CacheManager.getInstance().saveSearchHistory(list); initSearchHistory(); } private void initSearchHistory() { List<String> list = CacheManager.getInstance().getSearchHistory(); mHisAdapter.clear(); if (list != null && list.size() > 0) { tvClear.setEnabled(true); mHisAdapter.addAll(list); } else { tvClear.setEnabled(false); } mHisAdapter.notifyDataSetChanged(); } /** * SearchView * * @param key */ private void search(String key) { MenuItemCompat.expandActionView(searchMenuItem); if (!TextUtils.isEmpty(key)) { searchView.setQuery(key, true); saveSearchHistory(key); } } private void initSearchResult() { gone(mTagGroup, mLayoutHotWord, rlHistory); visible(mRecyclerView); if (mListPopupWindow.isShowing()) mListPopupWindow.dismiss(); } private void initTagGroup() { visible(mTagGroup, mLayoutHotWord, rlHistory); gone(mRecyclerView); if (mListPopupWindow.isShowing()) mListPopupWindow.dismiss(); } @Override public void onItemClick(int position) { SearchDetail.SearchBooks data = mAdapter.getItem(position); BookDetailActivity.startActivity(this, data._id); } @OnClick(R.id.tvClear) public void clearSearchHistory() { CacheManager.getInstance().saveSearchHistory(null); initSearchHistory(); } @Override public void showError() { loaddingError(); } @Override public void complete() { mRecyclerView.setRefreshing(false); } @Override protected void onDestroy() { super.onDestroy(); if (mPresenter != null) { mPresenter.detachView(); } } }