自定义控件实现搜索界面

xiaoxiao2021-02-28  27

上面两个就是效果图,是用手机拍的看起有不清楚,但是知道大概效果就ok了,

其实整体挺简单的,就是一个组合控件实现上面效果的,不多说直接上代码

layout_search_view.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/app_search_view_f4f4f4" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="25dp" android:background="@color/white" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white" android:paddingBottom="5dp"> <EditText android:textColor="@color/black" android:id="@+id/edit_search_content" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="14dp" android:layout_weight="1" android:background="@drawable/shape_search_edit" android:drawableLeft="@mipmap/icon_search" android:drawablePadding="8dp" android:hint="@string/text_174" android:paddingBottom="10dp" android:paddingLeft="14dp" android:paddingTop="10dp" /> <TextView android:textColor="@color/black" android:id="@+id/tv_cancel_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="10dp" android:paddingLeft="13dp" android:paddingRight="14dp" android:paddingTop="10dp" android:text="@string/text32" android:textSize="16sp" /> </LinearLayout> <LinearLayout android:id="@+id/linear_search_view" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="18dp" android:layout_marginLeft="16dp" android:layout_marginTop="20dp" android:text="@string/text_173" android:textColor="@color/tv_999999" android:textSize="18sp" /> <com.linghang.app.fragment.widget.FlowLayout android:id="@+id/flowlayout" android:layout_width="match_parent" android:layout_height="wrap_content" /> <RelativeLayout android:id="@+id/relative_search_history" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/tv_zj" android:text="@string/text_176" android:layout_marginLeft="16dp" android:layout_marginTop="@dimen/dp_10" android:textColor="@color/tv_999999" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/iv_delete" android:layout_marginRight="@dimen/dp_10" android:layout_marginTop="@dimen/dp_10" android:layout_alignParentRight="true" android:src="@mipmap/icon_trash" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_search_history" android:layout_below="@id/iv_delete" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout> </LinearLayout> </LinearLayout>

public class SearchLayout extends LinearLayout { private Context mContext; private View mSearchView; private LinearLayout mLinearLayout; private EditText mEidtContent; private TextView mSearchCancel; private RecyclerView mRecyclerHistory; private FlowLayout mHotTag; //历史搜索数据 private ArrayList<String> OldDataList = new ArrayList<String>(); private int countOldDataSize = 10;//默认搜索记录的条数 private SearchHistoryAdapter mHistoryAdapter; private OnClickListener TextViewItemListener; private String backtitle = "取消", searchtitle = "搜索"; private HashSet<String>removeSet=new HashSet<>(); private RelativeLayout mRelativeHistory; private View mIvDeleteHistory; public SearchLayout(Context context) { this(context, null); } public SearchLayout(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public SearchLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.mContext = context; setOrientation(LinearLayout.VERTICAL); mSearchView = LayoutInflater.from(context).inflate(R.layout.layout_search_view, null); LayoutParams lp=new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT); addView(mSearchView,lp); initView(); } private void initView() { mLinearLayout = mSearchView.findViewById(R.id.linear_search_view); mRelativeHistory = mSearchView.findViewById(R.id.relative_search_history); mEidtContent = mSearchView.findViewById(R.id.edit_search_content); mRecyclerHistory = mSearchView.findViewById(R.id.recycler_search_history); mHotTag = mSearchView.findViewById(R.id.flowlayout); mSearchCancel = mSearchView.findViewById(R.id.tv_cancel_search); mIvDeleteHistory = mSearchView.findViewById(R.id.iv_delete); mRecyclerHistory.setLayoutManager(new LinearLayoutManager(mContext)); mHistoryAdapter = new SearchHistoryAdapter(OldDataList); setLinstener(); } private void setLinstener() { mEidtContent.addTextChangedListener(mTextWatcher); TextViewItemListener = new OnClickListener() { @Override public void onClick(View v) { String string = ((TextView) v).getText().toString(); executeSearch_and_NotifyDataSetChanged(string); mLinearLayout.setVisibility(GONE); } }; //清除全部历史记录 mIvDeleteHistory.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (sCBlistener!=null){ sCBlistener.ClearOldData(); mRelativeHistory.setVisibility(GONE); mHistoryAdapter.setNewData(null); } } }); //点击历史记录字样 显示结果界面 mHistoryAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { @Override public void onItemClick(BaseQuickAdapter adapter, View view, int position) { String str = (String) adapter.getItem(position); executeSearch_and_NotifyDataSetChanged(str); mLinearLayout.setVisibility(GONE); } }); //清除历史搜索记录 mHistoryAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() { @Override public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { if (adapter.getData().size()==1){ adapter.remove(position); sCBlistener.ClearOldData(); mRelativeHistory.setVisibility(GONE); }else{ adapter.remove(position); sCBlistener.deleteItem((String) adapter.getItem(position),adapter.getData()); } } }); //单击finish当前页 mSearchCancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String searchText = mEidtContent.getText().toString().trim(); //如果是“搜索”字样就显示搜索界面 if (mSearchCancel.getText().toString().equals(searchtitle)) { executeSearch_and_NotifyDataSetChanged(searchText); } else { if (sCBlistener != null) { sCBlistener.Back(); } } mEidtContent.setText(""); //隐藏热门搜索和最近搜索 mLinearLayout.setVisibility(GONE); } }); //设置软键盘弹出后 取消软键盘上搜索字样 mEidtContent.setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) { String searchtext = mEidtContent.getText().toString().trim(); executeSearch_and_NotifyDataSetChanged(searchtext); //隐藏热门搜索和最近搜索 mLinearLayout.setVisibility(GONE); return true; } return false; } }); } private TextWatcher mTextWatcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() > 0) { //如果有数据就显示"搜索字样" mSearchCancel.setText(searchtitle); } else {//无 显示"取消字样" mSearchCancel.setText(backtitle); } } @Override public void afterTextChanged(Editable s) { } }; /** * 把搜索的内容提供出去方便进行联网搜索获取其他 * * @param str */ private void executeSearch_and_NotifyDataSetChanged(String str) { if (sCBlistener != null && !"".equals(str)) { //如果两者点击的搜索是同一个就不进行添加 if (OldDataList.size() > 0 && OldDataList.get(0).equals(str)) { } else { if (OldDataList.size() <= countOldDataSize && OldDataList.size() > 0){ if (OldDataList.size()==countOldDataSize) OldDataList.remove(OldDataList.size() - 1); removeSet.addAll(OldDataList); boolean isAdd = removeSet.add(str); if (isAdd){ OldDataList.add(0, str);//把最新的添加到前面 //数据刷新 mHistoryAdapter.setNewData(OldDataList); //提供接口出去方便就行保存历史数据 sCBlistener.SaveOldData(str); } } } sCBlistener.Search(str); } } /** * @param olddatalist 历史搜索数据集合 * @param hotdata 热门搜索数据集合 * @param sCb 事件处理监听 */ public void initData(List<String> olddatalist, List<String> hotdata, SearchCallBackListener sCb) { SetCallBackListener(sCb); mHotTag.removeAllViews(); OldDataList.clear(); if (olddatalist.size()==0||olddatalist.get(0).equals("")) mRelativeHistory.setVisibility(GONE); if (OldDataList != null) OldDataList.addAll(olddatalist); mRecyclerHistory.setAdapter(mHistoryAdapter); LayoutInflater mInflater = LayoutInflater.from(mContext); for (int i = 0; i < hotdata.size(); i++) { TextView tv = (TextView) mInflater.inflate(R.layout.suosou_item, mHotTag, false); tv.setText(hotdata.get(i)); tv.setOnClickListener(TextViewItemListener); mHotTag.addView(tv); } } public void setHotTagList(List<String> hotdata){ mHotTag.removeAllViews(); LayoutInflater mInflater = LayoutInflater.from(mContext); for (int i = 0; i < hotdata.size(); i++) { TextView tv = (TextView) mInflater.inflate(R.layout.suosou_item, mHotTag, false); tv.setText(hotdata.get(i)); tv.setOnClickListener(TextViewItemListener); mHotTag.addView(tv); } } public interface SearchCallBackListener { /** * @param str 搜索关键字 */ public void Search(String str); /** * 保存搜索记录 */ public abstract void SaveOldData(String alloldData); /** * 后退 */ void Back(); /** * 清除历史记录 */ void ClearOldData(); /** * 删除某一项 */ void deleteItem(String str, List<String> oldList); } private SearchCallBackListener sCBlistener; /** * 设置 接口回调 * * @param sCB */ private void SetCallBackListener(SearchCallBackListener sCB) { sCBlistener = sCB; } }

使用:

String history = (String) SPUtils.get(this, SPUtils.SEARCH_HISTORY_DATA, ""); List<String> skills = Arrays.asList(history.split(",")); //PPLog.e(skills.toString()); String shareHotData = ""; List<String> skillHots = Arrays.asList(shareHotData.split(",")); mSearchlayout.initData(skills, skillHots, new SearchLayout.SearchCallBackListener() { @Override public void Search(String str) { //隐藏软键盘 hideKeyboard(); //点击搜索后显示搜索出来的界面 //FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); android.app.FragmentTransaction ft = getFragmentManager().beginTransaction(); NetSearchClassFragment fragment = NetSearchClassFragment.newInstance(str); ft.replace(R.id.search_frame, fragment).commitAllowingStateLoss(); } @Override public void SaveOldData(String alloldData) { //保存搜索的关键字,以便后面在进入显示在历史搜索 String historyStr = (String) SPUtils.get(SearchActivity.this, SPUtils.SEARCH_HISTORY_DATA, ""); StringBuffer buffer = new StringBuffer(historyStr); if ("".equals(historyStr)) { buffer.append(alloldData); } else { buffer.append("," + alloldData); } String oldData = buffer.toString(); SPUtils.put(SearchActivity.this, SPUtils.SEARCH_HISTORY_DATA, oldData); } @Override public void Back() { //点击取消 关闭当前界面 finish(); } @Override public void ClearOldData() { //清除历史记录 SPUtils.remove(SearchActivity.this, SPUtils.SEARCH_HISTORY_DATA); } @Override public void deleteItem(String str, List<String> oldList) { SPUtils.remove(SearchActivity.this, SPUtils.SEARCH_HISTORY_DATA); String historyStr = ""; StringBuffer buffer = new StringBuffer(historyStr); for (int i = 0; i < oldList.size(); i++) { if (i == 0) { if ("".equals(historyStr)) { buffer.append(oldList.get(i)); continue; } } buffer.append(oldList.get(i)); } String oldData = buffer.toString(); SPUtils.put(SearchActivity.this, SPUtils.SEARCH_HISTORY_DATA, oldData); } });

SPUtils

public class SPUtils { /** * 搜索界面的历史搜索数据 * */ public static final String SEARCH_HISTORY_DATA="search_history_data"; /** * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 * * @param context * @param key * @param object */ public static void put(Context context, String key, Object object) { SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); if (object instanceof String) { editor.putString(key, (String) object); } else if (object instanceof Integer) { editor.putInt(key, (Integer) object); } else if (object instanceof Boolean) { editor.putBoolean(key, (Boolean) object); } else if (object instanceof Float) { editor.putFloat(key, (Float) object); } else if (object instanceof Long) { editor.putLong(key, (Long) object); } else { editor.putString(key, object.toString()); } SharedPreferencesCompat.apply(editor); } /** * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 * * @param context * @param key * @param defaultObject * @return */ public static Object get(Context context, String key, Object defaultObject) { SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); if (defaultObject instanceof String) { return sp.getString(key, (String) defaultObject); } else if (defaultObject instanceof Integer) { return sp.getInt(key, (Integer) defaultObject); } else if (defaultObject instanceof Boolean) { return sp.getBoolean(key, (Boolean) defaultObject); } else if (defaultObject instanceof Float) { return sp.getFloat(key, (Float) defaultObject); } else if (defaultObject instanceof Long) { return sp.getLong(key, (Long) defaultObject); } return null; } /** * 移除某个key值已经对应的值 * @param context * @param key */ public static void remove(Context context, String key) { SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.remove(key); SharedPreferencesCompat.apply(editor); } /** * 清除所有数据 * @param context */ public static void clear(Context context) { SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.clear(); SharedPreferencesCompat.apply(editor); } /** * 查询某个key是否已经存在 * @param context * @param key * @return */ public static boolean contains(Context context, String key) { SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); return sp.contains(key); } /** * 返回所有的键值对 * * @param context * @return */ public static Map<String, ?> getAll(Context context) { SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); return sp.getAll(); } /** * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类 * * @author zhy * */ private static class SharedPreferencesCompat { private static final Method sApplyMethod = findApplyMethod(); /** * 反射查找apply的方法 * * @return */ @SuppressWarnings({ "unchecked", "rawtypes" }) private static Method findApplyMethod() { try { Class clz = SharedPreferences.Editor.class; return clz.getMethod("apply"); } catch (NoSuchMethodException e) { } return null; } /** * 如果找到则使用apply执行,否则使用commit * * @param editor */ public static void apply(SharedPreferences.Editor editor) { try { if (sApplyMethod != null) { sApplyMethod.invoke(editor); return; } } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { } editor.commit(); } } }
转载请注明原文地址: https://www.6miu.com/read-2626436.html

最新回复(0)