gpt4 book ai didi

Android 操作栏搜索 : How to filter a list by the property of a list item?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:08 25 4
gpt4 key购买 nike

我有一个带有列表项的 ListView ,其中有几个 TextView 和一个复选框。使用操作栏搜索,我需要按 TextView 值过滤掉列表。

这是我需要按“优先级”过滤的列表。

enter image description here

这是我用来过滤数据采纳者列表的方法。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();

searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);

SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener()
{
@Override
public boolean onQueryTextChange(String newText)
{
// this is your adapter that will be filtered
dataAdapter.getFilter().filter(newText);
System.out.println("on text chnge text: "+newText);
return true;
}
@Override
public boolean onQueryTextSubmit(String query)
{
// this is your adapter that will be filtered
dataAdapter.getFilter().filter(query);
System.out.println("on query submit: "+query);
return true;
}
};
searchView.setOnQueryTextListener(textChangeListener);

return super.onCreateOptionsMenu(menu);

}

我已将 dataAdopter 设置为我的 ListView ,其中包含几个元素,即 3 个 TextView 和一个复选框。

// create an ArrayAdaptar from the String Array
dataAdapter = new MyCustomAdapter(this, R.layout.task_info, taskList);
listView = (ListView) findViewById(R.id.listView1);
// Assign adapter to ListView
listView.setAdapter(dataAdapter);

但是当我按照以下方式设置适配器时;仅使用值的字符串数组,过滤发生没有任何问题

String[] dataArray = new String[] {"High","Medium", "Low", "Medium", "High", "Low","High"};
listView = (ListView) findViewById(R.id.listview);
myAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, dataArray);
listView.setAdapter(myAdapter);

是否有任何方法可用于根据列表项内的 TextView 的值过滤列表?或者是否有任何替代方法来实现所需的功能。

最佳答案

最有效的方法是在您的适配器上实现一个过滤器。为此,您必须实现 Filterable 接口(interface)(实现 Filterable)。然后像这样实现方法 getFilter。

@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
List<Object> filteredResult = getFilteredResults(charSequence);

FilterResults results = new FilterResults();
results.values = filteredResult;
results.count = filteredResult.size();

return results;
}

@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
listaFiltrada = (ArrayList<Documento>) filterResults.values;
MyAdapter.this.notifyDataSetChanged();
}


private ArrayList<Object> getFilteredResults(CharSequence constraint){
if (constraint.length() == 0){
return listaDocumentos;
}
ArrayList<Object> listResult = new ArrayList<Object>();
for (Object obj : listaTotal){
if (condition){
listResult.add(obj);
}
}
return listResult;
}
};
}

最后,在您的 Fragment 或 Activity 中,在 onCreateOptionsMenu 方法中获取 EditText(搜索)并添加:

final EditText editText = (EditText) menu.findItem(R.id.menu_buscar).getActionView();
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

}

@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
if (myAdapter != null) {
myAdapter.getFilter().filter(charSequence);
}
}

@Override
public void afterTextChanged(Editable editable) {

}
});

希望对你有帮助:)

关于Android 操作栏搜索 : How to filter a list by the property of a list item?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24546412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com