当Recyclerview绑定了一大段数据的时候、但我们有时候想要快速找到某一个item,这时候通过搜索关键字就能够快速找到相应的item了。
-
recyclerview 绑定数据到适配器adapter
-
初始化相关对象
-
adapter = new InviteMessageAdapter(this);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
-
绑定数据
/**
* 获取申请信息
*/
private void getInviteMessage() {
if (inviteMessgeDao == null) {
inviteMessgeDao = new InviteMessgeDao(this);
}
if (inviteMessgeDao.getMessagesList().size() != 0) {
if (friends == null) {
friends = new ArrayList<>();
}
friends.addAll(inviteMessgeDao.getMessagesList());
adapter.setFriends(friends);
}
}
-
自定义一个搜索输入框
可以是一个普通的EditText,给他一个id:query
-
query:添加文本变化监听事件:
query.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
//过滤操作
adapter.getFilter().filter(s);
if (s.length() > 0) {
searchClear.setVisibility(View.VISIBLE);
} else {
searchClear.setVisibility(View.INVISIBLE);
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void afterTextChanged(Editable s) {
}
});
-
清空文本
//清除搜索内容
searchClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
query.getText().clear();
}
});
-
adapter相关
-
绑定数据
public void setFriends(List<InviteMessage> data) {
//复制数据
mCopyInviteMessages = new ArrayList<>();
this.mCopyInviteMessages.addAll(data);
this.inviteMessages = data;
this.notifyDataSetChanged();
}
-
adapter实现android.widget.Filterable接口
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
//初始化过滤结果对象
FilterResults results = new FilterResults();
//假如搜索为空的时候,将复制的数据添加到原始数据,用于继续过滤操作
if (results.values == null) {
inviteMessages.clear();
inviteMessages.addAll(mCopyInviteMessages);
}
//关键字为空的时候,搜索结果为复制的结果
if (constraint == null || constraint.length() == 0) {
results.values = mCopyInviteMessages;
results.count = mCopyInviteMessages.size();
} else {
String prefixString = constraint.toString();
final int count = inviteMessages.size();
//用于存放暂时的过滤结果
final ArrayList<InviteMessage> newValues = new ArrayList<InviteMessage>();
for (int i = 0; i < count; i++) {
final InviteMessage value = inviteMessages.get(i);
String username = value.getFrom();
EaseUser user = EaseUserUtils.getUserInfo(username);
if (user != null && user.getNick() != null) {
username = user.getNick();
}
// First match against the whole ,non-splitted value,假如含有关键字的时候,添加
if (username.contains(prefixString)) {
newValues.add(value);
} else {
//过来空字符开头
final String[] words = username.split(" ");
final int wordCount = words.length;
// Start at index 0, in case valueText starts with space(s)
for (int k = 0; k < wordCount; k++) {
if (words[k].contains(prefixString)) {
newValues.add(value);
break;
}
}
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;//过滤结果
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
adapter.inviteMessages.clear();//清除原始数据
adapter.inviteMessages.addAll((List<InviteMessage>) results.values);//将过滤结果添加到这个对象
if (results.count > 0) {
adapter.notifyDataSetChanged();//有关键字的时候刷新数据
} else {
//关键字不为零但是过滤结果为空刷新数据
if (constraint.length() != 0) {
adapter.notifyDataSetChanged();
return;
}
//加载复制的数据,即为最初的数据
adapter.setFriends(mCopyInviteMessages);
}
}
};
}
}
本次笔记到此为止,实现方法就是这样,希望能够对你有帮助。我也很希望得到你的指教。github 有个有关recyclerview过滤操作的开源项目可以去看看,主要用到了searchview