当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 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 newValues = new ArrayList();

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) results.values);//将过滤结果添加到这个对象

if (results.count > 0) {

adapter.notifyDataSetChanged();//有关键字的时候刷新数据

} else {

//关键字不为零但是过滤结果为空刷新数据

if (constraint.length() != 0) {

adapter.notifyDataSetChanged();

return;

}

//加载复制的数据,即为最初的数据

adapter.setFriends(mCopyInviteMessages);

}

}

};

}

}

本次笔记到此为止,实现方法就是这样,希望能够对你有帮助。我也很希望得到你的指教。github 有个有关recyclerview过滤操作的开源项目可以去看看,主要用到了searchview

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐