您的位置:首页 > 移动开发 > Android开发

SearchView和RecyclerView实现搜索界面,2018/1/1 04

2018-01-01 00:15 281 查看
2018年第一篇博客,新的一年新的开始,今年要坚持写下去。

Android Developers 中SerarchView网址

首先xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.searchdemo.MainActivity">

<RelativeLayout
android:layout_marginTop="24px"
android:layout_marginBottom="24px"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_marginRight="44px"
android:layout_marginLeft="33px"
android:id="@+id/search_cancel_text_view"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:text="取消"
android:textSize="44px"
android:textColor="@color/yi_666666"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<android.support.v7.widget.SearchView
android:id="@+id/search_search_view"
android:layout_toLeftOf="@id/search_cancel_text_view"
android:layout_marginLeft="44px"
app:iconifiedByDefault="true"
app:searchHintIcon="@mipmap/cm_search"
app:searchIcon="@mipmap/cm_search"
app:defaultQueryHint="输入姓名搜索"
app:queryBackground="@drawable/shape_round_rectangle_f5f5f5_2"
android:background="@drawable/shape_round_rectangle_f5f5f5_2"
android:layout_width="match_parent"
android:layout_height="78px"/>

</RelativeLayout>
<View
android:background="@color/yi_dbdbdb"
android:layout_width="match_parent"
android:layout_height="2px"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_marginLeft="44px"
android:layout_marginTop="44px"
android:textSize="40px"
android:textColor="@color/yi_666666"
android:text="最近搜索"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/search_clear_text_view"
android:layout_alignParentRight="true"
android:layout_marginRight="44px"
android:layout_marginTop="44px"
android:textSize="40px"
android:textColor="@color/yi_666666"
android:text="清空"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:layout_marginTop="33px"
android:id="@+id/search_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content">

</android.support.v7.widget.RecyclerView>

</LinearLayout>


其中iconifiedByDefault:控制进入页面时是否直接为搜索状态

4000
true为显示搜索提示图片(searchIcon)点击之后进入搜索状态,之后搜索图片显示为searchHintIcon,提示文字为defaultQueryHint,搜索状态的背景为queryBackground。

false则直接为搜索状态。

代码实现:

一,SearchView 初始设置

//找到SearchView中的textview ,从而修改输入的文字颜色字体大小等
LinearLayout linearLayout1 = (LinearLayout) mSearchView.getChildAt(0);
LinearLayout linearLayout2 = (LinearLayout) linearLayout1.getChildAt(2);
LinearLayout linearLayout3 = (LinearLayout) linearLayout2.getChildAt(1);
mAutoCompleteTextView = (AutoCompleteTextView) linearLayout3.getChildAt(0);
mAutoCompleteTextView.setTextSize(13);
mAutoCompleteTextView.setTextColor(getResources().getColor(R.color.colorAccent));
mSearchCancelTextView.setOnClickListener(this);
mSearchClearTextView.setOnClickListener(this);
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
//当点击输入键盘上的确定 按钮时的回调返回输入的搜索的数据
//这里是通过sp保存数据,并且是把所有搜索的数据转成json之后报错
mSearchNames.add(query);
SharedPreferencesHelper.getEditor().putString("search_names", JsonUtil.ListToJsonString(mSearchNames)).commit();
return false;
}

@Override
public boolean onQueryTextChange(String newText) {
mQueryText=newText;
//为空则为取消状态,点击取消可以返回上一页
//当有数据时则为搜索状态,点击搜索
if(mQueryText.equals("")){
mState=0;
mSearchCancelTextView.setText("取消");
}else{
mState=1;
mSearchCancelTextView.setText("搜索");
}
return true;
}
});


二,RecyclerView初始设置

其中涉及到了FlexFoxLayout这是google推出的一个能够动态显示textView的布局,因为直接使用感觉太过麻烦需要建好多textView,我就改为使用RecyclerView加FlexboxLayoutManager 来实现同样的效果。

FlexFoxLayout Github链接

//从sp中取出之前搜索过的内容
String searchNames = SharedPreferencesHelper.getSharedPreferences().getString("search_names", "");
//装成list集合
mSearchNames = JsonUtil.JsonToListString(searchNames);
FlexboxLayoutManager flexboxLayoutManager = new FlexboxLayoutManager(this);
mRecyclerView.setLayoutManager(flexboxLayoutManager);
mSearchAdapter = new MySearchAdapter();
mRecyclerView.setAdapter(mSearchAdapter);


private class MySearchAdapter extends RecyclerView.Adapter<SearchViewHolder> {
@Override
public SearchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
TextView textView=new TextView(MainActivity.this);
textView.setTextColor(getResources().getColor(R.color.colorPrimary));
textView.setTextSize(16);
//必须是FlexboxLayoutManager下的LayoutParams
FlexboxLayoutManager.LayoutParams layoutParams= new FlexboxLayoutManager.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(44,30,44,30);
textView.setLayoutParams(layoutParams);
return new SearchViewHolder(textView);
}

@Override
public void onBindViewHolder(SearchViewHolder holder, int position) {
holder.bindViewHolder();
}

@Override
public int getItemCount() {
return mSearchNames.size();
}
}

private class SearchViewHolder extends RecyclerView.ViewHolder {

private SearchViewHolder(View itemView) {
super(itemView);
}

private void bindViewHolder(){
if(itemView instanceof TextView) {
//如果itemView是TextView 进行初始化搜索过的数据
((TextView) itemView).setText(mSearchNames.get(mSearchNames.size()-getAdapterPosition()-1));
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//处理点击搜索
}
});
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐