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

使用SearchView+RecyclerView做搜索框

2017-04-06 22:24 232 查看
安卓搜索框分别使用了EditText+RecycleView和SearchView+RecycleView都实现了一遍 对比下两种的区别!

首先是一张效果图!



一、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:iconifiedByDefaultsetIconifiedByDefault(boolean)设置搜索图标是否显示在搜索框内
android:imeOptionssetImeOptions(int)设置输入法搜索选项字段,默认是搜索,可以是:下一页、发送、完成等
android:inputTypesetInputType(int)设置输入类型
android:maxWidthsetMaxWidth(int)设置最大宽度
android:queryHintsetQueryHint(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