这是我的自定义列表适配器如何在自定义列表适配器中使用编辑文本实现搜索工具。我尝试了很多方法来实现搜索功能
If dgvReport2.Rows.Count > 0 Then
For rows As Integer = 0 To dgvReport.Rows.Count - 1
dgvReport2.Rows(rows).Cells(newCol).Value =
dgvReport.Rows(rows).Cells(1).Value
Next
Else
For rows As Integer = 0 To dgvReport.Rows.Count - 1
dgvReport2.Rows.Add(dgvReport.Rows(rows).Cells(1).Value)
Next
End If
答案 0 :(得分:3)
或者您可以使用TextWatcher:
当一个类型的对象附加到Editable时,将在更改文本时调用其方法。
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
}
});
现在,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);
}
将过滤器功能添加到Adapter类中,不要忘记调用 notifyDataSetChanged 来更新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();
}
另外,请看一下同一主题的其他问答:
答案 1 :(得分:0)
试试这个可以帮到你。 使用textwatcher作为您的edittext,如下所示:
// In your main activity
et_Search = (EditText)findViewById(R.id.et_Search);
et_SearchBar.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count)
{
try
{
try{
(listDatacontainers).getFilter().filter(s.toString());
}
catch(Exception e)
{
Log.i("error at ListAdapter", e.toString());
}
}
catch (Exception e)
{
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s)
{
}
});
在适配器源文件中创建方法getfilter()