要实现搜索框的动态刷新,我们需要注意两个要点,一个是数据源,即能够每次在输入搜索数据以后都能够得到一个与输入的数据相关的数据源,用来显示在RecylerView当中,另一个是RecylerView的适配器是以内部类的方式写在主活动当中,方便刷新。
1.准备数据源
此处是以百度地图为例,在输入框每次的状态改变后,都会调用一次百度地图SDK的SuggestionSearch事件监听,从而获得关键数据源。
关键代码1:用于返回事件监听的数据
OnGetSuggestionResultListener listener = new OnGetSuggestionResultListener() {
@Override
public void onGetSuggestionResult(SuggestionResult suggestionResult) {
//处理sug检索结果
if(suggestionResult == null || suggestionResult.getAllSuggestions() == null){
System.out.println("未找到");
}else{
suggest = suggestionResult.getAllSuggestions();
for (SuggestionResult.SuggestionInfo suggestionInfo:suggest){
System.out.println("所查找地址:"+suggestionInfo.getAddress()+"长度:"+suggestionInfo.getAddress().length());
}
searchAdapter.reFresh(suggest);
}
}
};
mSuggestionSearch.setOnGetSuggestionResultListener(listener);
关键代码2:监听输入框的状态,从而请求新的数据
//查找逻辑实现
private void search() {
TextWatcher watcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if (editText.getEditableText().length() >= 1){
btnClear.setVisibility(View.VISIBLE);
} else{
btnClear.setVisibility(View.GONE);
}
mSuggestionSearch.requestSuggestion(new SuggestionSearchOption()
.city("长沙")//此处应该是根据需求传入城市地址,为求方便选择了长沙
.keyword(""+editText.getText().toString()));
}
};
editText.addTextChangedListener(watcher);
}
2.准备适配器并调用适配器的notifyDataSetChanged()方法刷新数据
关键代码:
public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.MyViewHolder> {
List<SuggestionResult.SuggestionInfo> suggest = new ArrayList<>();
TargetAddress targetAddress = null;
SearchAdapter(List<SuggestionResult.SuggestionInfo> suggest){
this.suggest = suggest;
}
@NonNull
//绑定当前视图布局
@Override
public SearchAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_list_item, parent, false);
final SearchAdapter.MyViewHolder vh = new SearchAdapter.MyViewHolder(view);
vh.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = vh.getAdapterPosition();