通过这两个名字的ListView ArrayAdapter过滤 [英] ListView ArrayAdapter filtering by two names
本文介绍了通过这两个名字的ListView ArrayAdapter过滤的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我已经做了针对Android应用程序列出与名字联系等于例如约翰。但我需要用名1
或名2
,例如彼得或约翰$查看联系人C $ C>。
我已经尝试设置过滤器彼得或John
,彼得||约翰
,但它确实不行。你能帮我吗?
解决方案
您应该编写自定义适配器和过滤器。 公共类MyAdapter<吨扩展BaseEntity>扩展ArrayAdapter< T>实现可筛选{ 私人MainClass.ObjectFilter滤波器;
私人最终名单< T>物体; 公共MyAdapter(列表< T>对象){
在此输入code
this.objects =物体;
用getFilter();
} @覆盖
公共过滤用getFilter(){
如果(过滤== NULL){
MainClass OFC =新MainClass(对象);
过滤器= ofc.getObjectFilter();
}
返回过滤器;
} 在此输入code
}
和自定义过滤器
公共类MainClass<吨扩展BaseEntity>扩展BaseEntity { 私人列表< T> allObjectItemsArray; //所有联系人列表
私人列表< T> filteredObjectItemsArray; //过滤联系人列表 公共ObjectFilterMainClass(列表< T>的对象)
{
this.allObjectItemsArray =新的ArrayList< T>();
this.allObjectItemsArray.addAll(对象);
this.filteredObjectItemsArray =新的ArrayList< T>();
this.filteredObjectItemsArray.addAll(allObjectItemsArray);
} 公共ObjectFilter的getObjectFilter(){
返回新ObjectFilter的();
}
公共类ObjectFilter的扩展过滤器{ @覆盖
公共FilterResults performFiltering(CharSequence的约束){
//约束搜索文本 - >彼得·约翰OR
约束= constraint.toString()与toLowerCase()。
FilterResults结果=新FilterResults();
如果(约束=空&放大器;!&放大器; constraint.toString()长度()大于0){
ArrayList的< T> filteredItems =新的ArrayList< T>(); 答:(INT I = 0; I< allObjectItemsArray.size();我++){
的Tm = allObjectItemsArray.get(I)
//投米类
字符串fistnameAndLastName =((你的对象类)M).getFirstName()+((你的对象类)M).getLastName(); 如果(fistnameAndLastName.toLowerCase()。包括(约束)){
filteredItems.add(米);
继续执行;
} }
result.count = filteredItems.size();
result.values = filteredItems;
}其他{
同步(本){
result.values = allObjectItemsArray;
result.count = allObjectItemsArray.size();
}
}
返回结果;
} @覆盖
公共无效publishResults(CharSequence的约束,FilterResults结果){ filteredObjectItemsArray =(ArrayList的< T>)results.values;
adapter.notifyDataSetChanged();
adapter.clear();
如果(filteredObjectItemsArray!= NULL){ 的for(int i = 0; I< filteredObjectItemsArray.size();我++)
adapter.add(filteredObjectItemsArray.get(I));
}
adapter.notifyDataSetInvalidated();
} } } 主要的一点就是让姓和名,并检查约束的文本。
之后,如果真的添加filteredItems列表。 字符串fistnameAndLastName =((你的对象类)M).getFirstName()+((你的对象类)M).getLastName(); 如果(fistnameAndLastName.toLowerCase()。包括(约束))
{
filteredItems.add(米);
继续执行;
并使用: 美国东部时间的EditText =(EditText上)this.view.findViewById(R.id.edtTxtName); edt.addTextChangedListener(新TextWatcher(){
公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数后INT){
} @覆盖
公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){
addFilterToList();
} @覆盖
公共无效afterTextChanged(编辑S){ }
}); 公共无效addFilterToList(){ ListView控件的ListView =(ListView控件)this.view.findViewById(R.id.listView); 美国东部时间的EditText =(EditText上)this.view.findViewById(R.id.edtTxtName); MyAdapter MYA =(MyAdapter)//
(listView.getAdapter()); 。myA.getFilter()过滤(edt.getText()); listView.setAdapter(MYA);
}
I have done an application for android to list contact with first name equals for example John. But I need view contact with name1
OR name2
, for example Peter OR John
.
I have tried set filter "Peter OR John
", "Peter || John
", but it does not work. Can you help me, please?
解决方案
you should be write your custom adapter and filter.
public class MyAdapter<T extends BaseEntity> extends ArrayAdapter<T> implements Filterable{
private MainClass.ObjectFilter filter;
private final List<T> objects;
public MyAdapter(List<T> objects){
enter code here
this.objects = objects;
getFilter();
}
@Override
public Filter getFilter() {
if (filter == null){
MainClass ofc = new MainClass(objects);
filter = ofc.getObjectFilter();
}
return filter;
}
enter code here
}
and custom filter
public class MainClass<T extends BaseEntity> extends BaseEntity {
private List<T> allObjectItemsArray; // all contact list
private List<T> filteredObjectItemsArray; // filtered contact list
public ObjectFilterMainClass(List<T> objects)
{
this.allObjectItemsArray = new ArrayList<T>();
this.allObjectItemsArray.addAll(objects);
this.filteredObjectItemsArray = new ArrayList<T>();
this.filteredObjectItemsArray.addAll(allObjectItemsArray);
}
public ObjectFilter getObjectFilter(){
return new ObjectFilter();
}
public class ObjectFilter extends Filter {
@Override
public FilterResults performFiltering(CharSequence constraint) {
// constraint search text --> Peter OR John
constraint = constraint.toString().toLowerCase();
FilterResults result = new FilterResults();
if (constraint != null && constraint.toString().length() > 0) {
ArrayList<T> filteredItems = new ArrayList<T>();
a: for (int i = 0; i < allObjectItemsArray.size(); i++) {
T m = allObjectItemsArray.get(i);
// cast m to your class
String fistnameAndLastName = ((your object class) m).getFirstName() + ((your object class) m).getLastName();
if (fistnameAndLastName.toLowerCase().contains(constraint)) {
filteredItems.add(m);
continue a;
}
}
result.count = filteredItems.size();
result.values = filteredItems;
} else {
synchronized (this) {
result.values = allObjectItemsArray;
result.count = allObjectItemsArray.size();
}
}
return result;
}
@Override
public void publishResults(CharSequence constraint, FilterResults results) {
filteredObjectItemsArray = (ArrayList<T>) results.values;
adapter.notifyDataSetChanged();
adapter.clear();
if (filteredObjectItemsArray != null) {
for (int i = 0; i < filteredObjectItemsArray.size(); i++)
adapter.add(filteredObjectItemsArray.get(i));
}
adapter.notifyDataSetInvalidated();
}
}
}
main point is get first and last name and check the constraint text.
after that if true add filteredItems list.
String fistnameAndLastName = ((your object class) m).getFirstName() + ((your object class) m).getLastName();
if (fistnameAndLastName.toLowerCase().contains(constraint))
{
filteredItems.add(m);
continue a;
and use :
EditText edt = (EditText) this.view.findViewById(R.id.edtTxtName);
edt.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
addFilterToList();
}
@Override
public void afterTextChanged(Editable s) {
}
});
public void addFilterToList() {
ListView listView = (ListView) this.view.findViewById(R.id.listView);
EditText edt = (EditText) this.view.findViewById(R.id.edtTxtName);
MyAdapter myA = (MyAdapter) //
(listView.getAdapter());
myA.getFilter().filter(edt.getText());
listView.setAdapter(myA);
}
这篇关于通过这两个名字的ListView ArrayAdapter过滤的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文