package licola.demo.com.huabandemo.Module.Search; import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; import com.jakewharton.rxbinding.view.RxView; import com.jakewharton.rxbinding.widget.RxTextView; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import java.util.concurrent.TimeUnit; import butterknife.BindString; import butterknife.BindView; import licola.demo.com.huabandemo.API.HttpsAPI.SearchAPI; import licola.demo.com.huabandemo.Base.BaseActivity; import licola.demo.com.huabandemo.HttpUtils.RetrofitClient; import licola.demo.com.huabandemo.Module.Type.TypeActivity; import licola.demo.com.huabandemo.R; import licola.demo.com.huabandemo.Module.SearchResult.SearchResultActivity; import licola.demo.com.huabandemo.Util.CompatUtils; import licola.demo.com.huabandemo.Util.Constant; import licola.demo.com.huabandemo.Util.Logger; import licola.demo.com.huabandemo.Util.SPUtils; import licola.demo.com.huabandemo.Util.Utils; import licola.demo.com.huabandemo.Widget.FlowLayout; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; import rx.schedulers.Schedulers; /** * 搜索和全部分类模块 */ public class SearchAndTypeActivity extends BaseActivity { @BindView(R.id.actv_search) AutoCompleteTextView mACTVSearch; @BindView(R.id.scrollview_search) ScrollView mScrollViewSearch; @BindView(R.id.flow_reference) FlowLayout mFlowReference;//推荐的父控件 内容动态填充 @BindView(R.id.flow_history) FlowLayout mFlowHistory;//搜索历史父控件 内容动态填充 @BindView(R.id.ibtn_clear_history) ImageButton mIBtnClearHistory; @BindString(R.string.hint_not_history) String mStringNotHistory; // @BindViewDrawable(R.drawable.bg_tv_text_selector) // Drawable mTextDrawable; final int mItemLineNumber = 3;//每行的个数 final int mItemMargin = 1; final int mItemTVMargin = 10; int mItemWidth;//子控件的宽度 private ArrayAdapter<String> mAdapter; private ArrayList<String> mListHttpHint = new ArrayList<>(); @Override protected int getLayoutId() { return R.layout.activity_search; } @Override protected String getTAG() { return this.toString(); } public static void launch(Activity activity) { Intent intent = new Intent(activity, SearchAndTypeActivity.class); // ActivityCompat.startActivity(); activity.startActivity(intent); } @Override protected void onResume() { super.onResume(); initFlowHistory(mFlowHistory); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_search); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayShowTitleEnabled(false); mIBtnClearHistory.setImageDrawable(CompatUtils.getTintListDrawable(mContext, R.drawable.ic_close_black_24dp, R.color.tint_list_grey)); initFlowReference(mFlowReference); initHintAdapter(); initHintHttp(); mACTVSearch.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Logger.d(mListHttpHint.get(position)); SearchResultActivity.launch(SearchAndTypeActivity.this, mListHttpHint.get(position)); } }); RxTextView.editorActions(mACTVSearch, integer -> integer==EditorInfo.IME_ACTION_SEARCH).throttleFirst(500,TimeUnit.MILLISECONDS) .subscribe(integer -> {initActionSearch();}); initClearHistory();//点击按钮 清除历史记录的操作 } private void initHintHttp() { //// TODO: 2016/4/20 0020 目前存在bug okhttp的取消产生线程中断异常 目前在convert做异常捕捉 //调用onError后不再监听输入 由于bug导致 RxTextView.textChanges(mACTVSearch)//观察mACTVSearch的输入变化 .observeOn(Schedulers.io()) .filter(charSequence -> { return charSequence.length() > 0;//过滤空输入 }) //debounce 函数 过滤掉由Observable发射的速率过快的数据 .debounce(300, TimeUnit.MILLISECONDS) //switchMap函数 每当源Observable发射一个新的数据项(Observable)时, //它将取消订阅并停止监视之前那个数据项产生的Observable,并开始监视当前发射的这一个。 .switchMap(new Func1<CharSequence, Observable<SearchHintBean>>() { @Override public Observable<SearchHintBean> call(CharSequence charSequence) { return RetrofitClient.createService(SearchAPI.class) .httpsSearHintBean(mAuthorization, charSequence.toString()); } }) .map(SearchHintBean::getResult) .filter(strings -> (strings != null) && (strings.size() > 0)) .observeOn(AndroidSchedulers.mainThread()) .subscribe(strings -> { mListHttpHint.clear(); mListHttpHint.addAll(strings); mAdapter.notifyDataSetChanged(); }, throwable -> { Logger.d(throwable.toString()); }); } private void initHintAdapter() { mAdapter = new SearHintAdapter(mContext, android.R.layout.simple_spinner_dropdown_item, mListHttpHint); mACTVSearch.setAdapter(mAdapter); } private void initActionSearch() { if (mACTVSearch.getText().length() > 0) { SearchResultActivity.launch(SearchAndTypeActivity.this, mACTVSearch.getText().toString()); } } private void initClearHistory() { RxView.clicks(mIBtnClearHistory) .subscribe(new Subscriber<Void>() { @Override public void onCompleted() { Logger.d(); } @Override public void onError(Throwable e) { Logger.d(); } @Override public void onNext(Void aVoid) { Logger.d(); mFlowHistory.removeAllViews(); SPUtils.remove(mContext, Constant.HISTORYTEXT); addChildTextTips(mFlowHistory, mStringNotHistory); } }); } private void initFlowHistory(FlowLayout mFlowHistory) { mFlowHistory.removeAllViews(); // String mTextList[] = getResources().getStringArray(R.array.title_array_all);//显示的文字 Set<String> mTextList = (HashSet<String>) SPUtils.get(mContext, Constant.HISTORYTEXT, new HashSet<>()); if (!mTextList.isEmpty()) { for (String mTextString : mTextList) { Logger.d(mTextString); addChildText(mFlowHistory, mTextString); } } else { addChildTextTips(mFlowHistory, mStringNotHistory); } } private void initFlowReference(FlowLayout mFlowReference) { String mTextList[] = getResources().getStringArray(R.array.title_array_all);//显示的文字 String mTypeList[] = getResources().getStringArray(R.array.type_array_all);//查询的关键字 // int[] ColorResId=getResources().getIntArray(R.array.type_array_color); // int[] drawableResIdList=new int[]{R}; mItemWidth = Utils.getScreenWidth(mContext) / mItemLineNumber - mItemMargin * 2;//每个子控件宽为屏幕的等分 // mItemWidth= Utils.getScreenWidth(mContext)/mItemLineNumber; //根据内容动态填充 for (int i = 0, size = mTextList.length; i < size; i++) { addChildButton(mFlowReference, mTextList[i], mTypeList[i], R.drawable.ic_loyalty_white_24dp); } } private void addChildTextTips(FlowLayout group, String mTextString) { TextView tvChild = new TextView(mContext); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.gravity = Gravity.CENTER; layoutParams.setMargins(mItemTVMargin, mItemTVMargin, mItemTVMargin, mItemTVMargin); tvChild.setText(mTextString); tvChild.setLayoutParams(layoutParams); tvChild.setGravity(Gravity.CENTER_HORIZONTAL); group.addView(tvChild); } private void addChildText(FlowLayout group, String mTextString) { TextView tvChild = (TextView) LayoutInflater.from(mContext).inflate(R.layout.view_textview_history, group, false); // final TextView tvChild = new TextView(mContext); // LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); // layoutParams.gravity = Gravity.CENTER; // layoutParams.setMargins(mItemTVMargin, mItemTVMargin, mItemTVMargin, mItemTVMargin); tvChild.setText(mTextString); // tvChild.setTextColor(Color.WHITE); // Drawable drawable=getResources().getDrawable(R.drawable.bg_text_history); // tvChild.setBackground(drawable); // tvChild.setLayoutParams(layoutParams); // tvChild.setGravity(Gravity.CENTER_HORIZONTAL); tvChild.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SearchResultActivity.launch(SearchAndTypeActivity.this, ((TextView) v).getText().toString()); } }); group.addView(tvChild); } private void addChildButton(FlowLayout group, String text, String type, int ResId) { Button btnChild = new Button(mContext); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(mItemWidth, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.gravity = Gravity.CENTER; layoutParams.setMargins(mItemMargin, mItemMargin, mItemMargin, mItemMargin); btnChild.setCompoundDrawablesWithIntrinsicBounds( null, CompatUtils.getTintListDrawable(mContext, ResId, R.color.tint_list_pink), null, null); btnChild.setText(text); btnChild.setBackgroundColor(Color.WHITE); btnChild.setTag(type); // btnChild.setBackgroundColor(ResId); btnChild.setLayoutParams(layoutParams); btnChild.setGravity(Gravity.CENTER); btnChild.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TextView textView = (TextView) v; TypeActivity.launch(SearchAndTypeActivity.this, textView.getText().toString(), textView.getTag().toString()); } }); group.addView(btnChild); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_search, menu); // SearchView searchView = (SearchView) MenuItemCompat // .getActionView(menu.findItem(R.id.action_search)); // initSearchView(searchView); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Logger.d("menu id=" + item.getItemId()); switch (item.getItemId()) { case R.id.action_search: initActionSearch(); break; } return super.onOptionsItemSelected(item); } }