这是我的自定义列表适配器,如何使用编辑文本在自定义列表适配器中实现搜索功能。我尝试了很多方法来实现搜索功能
public class ListAdapter extends BaseAdapter {
public ArrayList<Users> listDataContainers = new ArrayList<>();
ListAdapter(ArrayList<Users> listDataContainers) {
this.listDataContainers = listDataContainers;
}
@Override
public int getCount() {
return listDataContainers.size();
}
@Override
public User getItem(int arg0) {
return listDataContainers.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int pos, View arg1, ViewGroup arg2) {
if (arg1 == null) {
LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
arg1 = inflater.inflate(R.layout.listitem_layout, arg2, false);
}
TextView pa_name = (TextView) arg1.findViewById(R.id.textName);
TextView pa_date = (TextView) arg1.findViewById(R.id.textRoom);
Patient item = listDataContainers.get(pos);
pa_name.setText(item.name);
pa_date.setText(item.adm_date);
if (pos % 2 == 0)
arg1.setBackgroundResource(R.drawable.listview_selector_white);
else
arg1.setBackgroundResource(R.drawable.listview_selector_grey);
return arg1;
}
}
Run Code Online (Sandbox Code Playgroud)
或者您可以使用TextWatcher:
当某个类型的对象附加到可编辑对象时,当文本更改时将调用其方法。
searchField = (EditText) findViewById(R.id.search);
searchField.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
String text = searchField.getText().toString().toLowerCase(Locale.getDefault());
adapter.filter(text);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
});
Run Code Online (Sandbox Code Playgroud)
现在,EditText 将捕获用户输入并将其传递给自定义适配器类的过滤器函数。
在自定义适配器的构造函数中,您需要初始化第二个列表,以跟踪当前所需/搜索的项目:
public class ListAdapter extends BaseAdapter {
public ArrayList<Users> listDataContainers = new ArrayList<>();
private ArrayList<Users> usersFilteredList;
ListAdapter(ArrayList<Users> listDataContainers) {
this.listDataContainers = listDataContainers;
this.usersFilteredList = new ArrayList<Users>();
this.usersFilteredList.addAll(listDataContainers);
}
Run Code Online (Sandbox Code Playgroud)
将过滤器函数添加到您的 Adapter 类中,并且不要忘记调用notificationDataSetChanged来更新 UI。
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
listDataContainers.clear();
if (charText.length() == 0) {
listDataContainers.addAll(usersFilteredList);
} else {
for (Users user : usersFilteredList) {
if (user.getName().toLowerCase(Locale.getDefault())
.contains(charText)) {
listDataContainers.add(user);
}
}
}
notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
另外,请查看有关同一主题的其他一些问答:
| 归档时间: |
|
| 查看次数: |
1669 次 |
| 最近记录: |