使用SearchView+RecyclerView做搜索框
2017-04-06 22:24
232 查看
安卓搜索框分别使用了EditText+RecycleView和SearchView+RecycleView都实现了一遍 对比下两种的区别!
首先是一张效果图!
一、EditText+RecycleView
先丢上代码!
adapter
SearchView虽然是官方的但是一般不推荐使用!对于搜索框的实现官方提供了SearchView但是很多坑需要去填推荐用EditText!
SearchView属性
贴上效果图
项目中经常遇到的问题
1.放大镜图标的替换
2.X图标的删除
3.Text框下划线删除
总结:虽然官方的组件挺好使的,但是在项目中使用需要自己重写一下才能使用。还是EditText比较适合!
首先是一张效果图!
一、EditText+RecycleView
先丢上代码!
Layout <?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:orientation="vertical"> <EditText android:id="@+id/search_tag_input_edit" android:layout_width="match_parent" android:layout_height="30dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:background="@drawable/shape_tag_search" android:layout_margin="8dp" android:hint="请输入检索Tag" android:drawableLeft="@mipmap/ic_search" android:drawablePadding="3dp" android:padding="8dp" android:maxLength="20" android:inputType="text" android:maxLines="1" android:textSize="12sp" /> <android.support.v7.widget.RecyclerView android:id="@+id/search_tag_recycler" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@null" android:listSelector="@android:color/transparent" /> </LinearLayout>
Activity package net.yeah.lililearn.searchrecyclerview; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import net.yeah.lililearn.searchrecyclerview.adapter.SearchAdapter; import net.yeah.lililearn.searchrecyclerview.model.SearchTag; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private EditText mSearchTagEdit; private RecyclerView mRecyclerView; private Handler handler = new Handler(); private List<SearchTag> searchTagList; private SearchAdapter mAdapter; private Runnable delayRun = new Runnable() { @Override public void run() { searchTags(mSearchTagEdit.getText().toString().trim()); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initAdapter(); setEvent(); } private void initView() { mSearchTagEdit = (EditText) findViewById(R.id.search_tag_input_edit); mRecyclerView = (RecyclerView) findViewById(R.id.search_tag_recycler); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setAnimation(null); } private void initAdapter() { searchTagList = new ArrayList<>(); mAdapter = new SearchAdapter(searchTagList, this); mRecyclerView.setAdapter(mAdapter); } private void setEvent() { mSearchTagEdit.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { //no-op } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { //no-op } @Override public void afterTextChanged(Editable editable) { //输入完成后严重8毫秒在请求 if (delayRun != null) { handler.removeCallbacks(delayRun); } handler.postDelayed(delayRun, 800); } }); } /** * 请求数据 * @param searchTagName */ private void searchTags(String searchTagName) { List<SearchTag> searchTags=new ArrayList<>(); searchTags.add(new SearchTag("测试数据1")); searchTags.add(new SearchTag("测试数据2")); searchTags.add(new SearchTag("测试数据3")); searchTags.add(new SearchTag("测试数据4")); searchTags.add(new SearchTag("测试数据5")); searchTags.add(new SearchTag("测试数据6")); searchTags.add(new SearchTag("测试数据7")); searchTags.add(new SearchTag("测试数据8")); searchTags.add(new SearchTag("测试数据9")); searchTags.add(new SearchTag("测试数据10")); searchTagList.clear(); searchTagList.addAll(searchTags); mAdapter.notifyDataSetChanged(); } }
adapter
package net.yeah.lililearn.searchrecyclerview.adapter; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebViewFragment; import android.widget.RelativeLayout; import android.widget.TextView; import net.yeah.lililearn.searchrecyclerview.R; import net.yeah.lililearn.searchrecyclerview.model.SearchTag; import java.util.List; import lombok.NonNull; public class SearchAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final int VIEW_TYPE_TOP = 0; private static final int VIEW_TYPE_ITEM = 1; private static final int VIEW_TYPE_END = 2; private static final int VIEW_TYPE_EMPTY = 3; private List<SearchTag> searchTagList; private Context context; public SearchAdapter(@NonNull List<SearchTag> Tags, @NonNull Context context) { this.context = context; this.searchTagList = Tags; Log.e("11",searchTagList.toString()); } @Override public int getItemViewType(int position) { Log.e("11",searchTagList.toString()); if (searchTagList.isEmpty()) { if (position == 0) { return VIEW_TYPE_EMPTY; } return VIEW_TYPE_END; } if (position == 0) { return VIEW_TYPE_TOP; } else if (position == getItemCount() - 1) { return VIEW_TYPE_END; } return VIEW_TYPE_ITEM; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case VIEW_TYPE_TOP: { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_goods_tag_top, parent, false); return new GoodsTagTopHolder(view); } case VIEW_TYPE_ITEM: { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_goods_tag_item, parent, false); return new GoodsTagItemHolder(view); } case VIEW_TYPE_END: { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_goods_tag_end, parent, false); GoodsTagEndHolder holder = new GoodsTagEndHolder(view); holder.setEvent(); return holder; } default: { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_goods_tag_empty, parent, false); return new EmptyViewHolder(view); } } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof GoodsTagItemHolder) { SearchTag searchTag = searchTagList.get(position - 1); GoodsTagItemHolder goodsTagItemHolder = (GoodsTagItemHolder) holder; goodsTagItemHolder.setData(searchTag); goodsTagItemHolder.setEvent(searchTag); } } @Override public int getItemCount() { if (searchTagList.isEmpty()) { return 2; } return searchTagList.size() + 2; } private class GoodsTagTopHolder extends RecyclerView.ViewHolder { GoodsTagTopHolder(View view) { super(view); } } private class GoodsTagItemHolder extends RecyclerView.ViewHolder { private TextView mGoodsTagItemTv; private RelativeLayout mGoodsTagItemLayout; GoodsTagItemHolder(View view) { super(view); mGoodsTagItemLayout = (RelativeLayout) view.findViewById(R.id.goods_tag_item_layout); mGoodsTagItemTv = (TextView) view.findViewById(R.id.goods_tag_item_tv); } public void setData(SearchTag searchTag) { String label = searchTag.getName(); mGoodsTagItemTv.setText(label); } public void setEvent(SearchTag searchTag) { } } private class GoodsTagEndHolder extends RecyclerView.ViewHolder { private TextView mGoodsTagLinkTv; GoodsTagEndHolder(View view) { super(view); mGoodsTagLinkTv = (TextView) view.findViewById(R.id.goods_tag_link_tv); } public void setEvent() { mGoodsTagLinkTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); } } private class EmptyViewHolder extends RecyclerView.ViewHolder { EmptyViewHolder(View itemView) { super(itemView); TextView textView = (TextView) itemView.findViewById(R.id.empty_text); } } }
SearchView虽然是官方的但是一般不推荐使用!对于搜索框的实现官方提供了SearchView但是很多坑需要去填推荐用EditText!
SearchView属性
属性名称 | 相关方法 | 描述 |
---|---|---|
android:iconifiedByDefault | setIconifiedByDefault(boolean) | 设置搜索图标是否显示在搜索框内 |
android:imeOptions | setImeOptions(int) | 设置输入法搜索选项字段,默认是搜索,可以是:下一页、发送、完成等 |
android:inputType | setInputType(int) | 设置输入类型 |
android:maxWidth | setMaxWidth(int) | 设置最大宽度 |
android:queryHint | setQueryHint(CharSequence) | 设置查询提示字符串 |
setSubmitButtonEnabled (boolean enabled) | 设置是否出现提交按钮 |
package net.yeah.lililearn.searchrecyclerview.activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView;; import android.text.TextUtils; import android.widget.SearchView; import net.yeah.lililearn.searchrecyclerview.R; import net.yeah.lililearn.searchrecyclerview.adapter.SearchAdapter; import net.yeah.lililearn.searchrecyclerview.model.SearchTag; import java.util.ArrayList; import java.util.List; public class SearchViewActivity extends AppCompatActivity { private RecyclerView mSearchTagRecycler; private List<SearchTag> searchTagList; private SearchAdapter mAdapter; private SearchView mSearchTagView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); initView(); initAdapter(); setEvent(); } private void initView() { mSearchTagView = (SearchView) findViewById(R.id.search_tag_view); mSearchTagRecycler = (RecyclerView) findViewById(R.id.search_tag_recycler); mSearchTagRecycler.setLayoutManager(new LinearLayoutManager(this)); mSearchTagRecycler.setAnimation(null); } private void initAdapter() { searchTagList = new ArrayList<>(); mAdapter = new SearchAdapter(searchTagList, this); mSearchTagRecycler.setAdapter(mAdapter); } private void setEvent() { mSearchTagView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // 当点击搜索按钮时触发该方法 return false; } @Override public boolean onQueryTextChange(String newText) { // 当搜索内容改变时触发该方法 if (!TextUtils.isEmpty(newText.trim())){ searchTags(newText.trim()); }else{ searchTagList.clear(); mAdapter.notifyDataSetChanged(); } return false; } }); } /** * 请求数据 * @param searchTagName */ private void searchTags(String searchTagName) { List<SearchTag> searchTags=new ArrayList<>(); searchTags.add(new SearchTag("测试数据1")); searchTags.add(new SearchTag("测试数据2")); searchTags.add(new SearchTag("测试数据3")); searchTags.add(new SearchTag("测试数据4")); searchTags.add(new SearchTag("测试数据5")); searchTags.add(new SearchTag("测试数据6")); searchTags.add(new SearchTag("测试数据7")); searchTags.add(new SearchTag("测试数据8")); searchTags.add(new SearchTag("测试数据9")); searchTags.add(new SearchTag("测试数据10")); searchTagList.clear(); searchTagList.addAll(searchTags); mAdapter.notifyDataSetChanged(); } }
<?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:orientation="vertical"> <SearchView android:id="@+id/search_tag_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:iconifiedByDefault="false" android:layout_margin="8dp" android:background="@drawable/shape_tag_search" android:queryHint="请输入搜索内容" /> <android.support.v7.widget.RecyclerView android:id="@+id/search_tag_recycler" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@null" android:listSelector="@android:color/transparent" /> </LinearLayout>
贴上效果图
项目中经常遇到的问题
1.放大镜图标的替换
2.X图标的删除
3.Text框下划线删除
总结:虽然官方的组件挺好使的,但是在项目中使用需要自己重写一下才能使用。还是EditText比较适合!
相关文章推荐
- Android搜索框组件SearchView的基本使用方法
- <SearchView > 搜索框的简单使用
- 两种Search Help的合并使用 : Database View + Search Help Exit
- 【Android】使用SearchView时软键盘不支持actionSearch的问题
- 将替代ListView的RecyclerView 的使用(一)
- ANDROID L——RecyclerView,CardView导入和使用(Demo)
- Android SearchView的使用方法
- moss2007 新建模板页 搜索框无法使用 SmallSearchInputBox
- Android RecyclerView 的简单使用
- Android开发之核心特性SearchView的开发使用(源代码分享)
- 【android-view】searchView 的搜索按钮使用问题。
- ANDROID L——RecyclerView,CardView导入和使用(Demo)
- 【Android】使用SearchView时软键盘不支持actionSearch的问题
- (转)Android SearchView 搜索框
- ios 中使用 Search Display Controller 来对 UITableView 进行前台查询
- 使用searchView搜索ListView的关键字
- SearchView 使用
- iOS开发 自定义tableView样式(使用代码/使用Interface Builder)、分组显示、给TableView增加索引、给TableView增加SearchBariOS开发 自定义tab
- 搜索框(SearchView)的功能与用法
- Android L中的RecyclerView 、CardView 、Palette的使用