當(dāng)Recyclerview綁定了一大段數(shù)據(jù)的時(shí)候胖腾、但我們有時(shí)候想要快速找到某一個(gè)item,這時(shí)候通過搜索關(guān)鍵字就能夠快速找到相應(yīng)的item了垛吗。
-
recyclerview 綁定數(shù)據(jù)到適配器adapter
-
初始化相關(guān)對象
-
adapter = new InviteMessageAdapter(this);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
-
綁定數(shù)據(jù)
/**
* 獲取申請信息
*/
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);
}
}
-
自定義一個(gè)搜索輸入框
可以是一個(gè)普通的EditText,給他一個(gè)id:query
-
query:添加文本變化監(jiān)聽事件:
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) {
}
});
-
清空文本
//清除搜索內(nèi)容
searchClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
query.getText().clear();
}
});
-
adapter相關(guān)
-
綁定數(shù)據(jù)
public void setFriends(List<InviteMessage> data) {
//復(fù)制數(shù)據(jù)
mCopyInviteMessages = new ArrayList<>();
this.mCopyInviteMessages.addAll(data);
this.inviteMessages = data;
this.notifyDataSetChanged();
}
-
adapter實(shí)現(xiàn)android.widget.Filterable接口
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
//初始化過濾結(jié)果對象
FilterResults results = new FilterResults();
//假如搜索為空的時(shí)候谍憔,將復(fù)制的數(shù)據(jù)添加到原始數(shù)據(jù)瘤缩,用于繼續(xù)過濾操作
if (results.values == null) {
inviteMessages.clear();
inviteMessages.addAll(mCopyInviteMessages);
}
//關(guān)鍵字為空的時(shí)候易结,搜索結(jié)果為復(fù)制的結(jié)果
if (constraint == null || constraint.length() == 0) {
results.values = mCopyInviteMessages;
results.count = mCopyInviteMessages.size();
} else {
String prefixString = constraint.toString();
final int count = inviteMessages.size();
//用于存放暫時(shí)的過濾結(jié)果
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枚抵,假如含有關(guān)鍵字的時(shí)候伯病,添加
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;//過濾結(jié)果
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
adapter.inviteMessages.clear();//清除原始數(shù)據(jù)
adapter.inviteMessages.addAll((List<InviteMessage>) results.values);//將過濾結(jié)果添加到這個(gè)對象
if (results.count > 0) {
adapter.notifyDataSetChanged();//有關(guān)鍵字的時(shí)候刷新數(shù)據(jù)
} else {
//關(guān)鍵字不為零但是過濾結(jié)果為空刷新數(shù)據(jù)
if (constraint.length() != 0) {
adapter.notifyDataSetChanged();
return;
}
//加載復(fù)制的數(shù)據(jù)造烁,即為最初的數(shù)據(jù)
adapter.setFriends(mCopyInviteMessages);
}
}
};
}
}
本次筆記到此為止,實(shí)現(xiàn)方法就是這樣午笛,希望能夠?qū)δ阌袔椭洋N乙埠芟M玫侥愕闹附獭ithub 有個(gè)有關(guān)recyclerview過濾操作的開源項(xiàng)目可以去看看药磺,主要用到了searchview