android 集合 过滤,列表视图过滤器Android

本文介绍了一种使用Java OldSchool SDK创建泛型过滤器类的方法,通过反射和泛型技术,简化了列表筛选过程。实例演示了如何构造过滤器、应用过滤算法及重写适配器方法,适用于列表数据的动态过滤需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果还有人对这个主题感兴趣,我发现筛选列表的最佳方法是创建一个泛型过滤器类,并将其与Java OldSchoolSDK包中包含的一些基本反射/泛型技术一起使用。以下是我所做的:public class GenericListFilter extends Filter {

/**

* Copycat constructor

* @param list  the original list to be used

*/

public GenericListFilter (List list, String reflectMethodName, ArrayAdapter adapter) {

super ();

mInternalList = new ArrayList<>(list);

mAdapterUsed  = adapter;

try {

ParameterizedType stringListType = (ParameterizedType)

getClass().getField("mInternalList").getGenericType();

mCompairMethod =

stringListType.getActualTypeArguments()[0].getClass().getMethod(reflectMethodName);

}

catch (Exception ex) {

Log.w("GenericListFilter", ex.getMessage(), ex);

try {

if (mInternalList.size() > 0) {

T type = mInternalList.get(0);

mCompairMethod = type.getClass().getMethod(reflectMethodName);

}

}

catch (Exception e) {

Log.e("GenericListFilter", e.getMessage(), e);

}

}

}

/**

* Let's filter the data with the given constraint

* @param constraint

* @return

*/

@Override protected FilterResults performFiltering(CharSequence constraint) {

FilterResults results = new FilterResults();

List filteredContents = new ArrayList<>();

if ( constraint.length() > 0 ) {

try {

for (T obj : mInternalList) {

String result = (String) mCompairMethod.invoke(obj);

if (result.toLowerCase().startsWith(constraint.toString().toLowerCase())) {

filteredContents.add(obj);

}

}

}

catch (Exception ex) {

Log.e("GenericListFilter", ex.getMessage(), ex);

}

}

else {

filteredContents.addAll(mInternalList);

}

results.values = filteredContents;

results.count  = filteredContents.size();

return results;

}

/**

* Publish the filtering adapter list

* @param constraint

* @param results

*/

@Override protected void publishResults(CharSequence constraint, FilterResults results) {

mAdapterUsed.clear();

mAdapterUsed.addAll((List) results.values);

if ( results.count == 0 ) {

mAdapterUsed.notifyDataSetInvalidated();

}

else {

mAdapterUsed.notifyDataSetChanged();

}

}

// class properties

private ArrayAdapter mAdapterUsed;

private List mInternalList;

private Method  mCompairMethod;}

然后,您需要做的唯一件事是将过滤器创建为一个成员类(可能在视图的“onCreate”中),传递适配器引用、列表和要调用的过滤方法:this.mFilter = new GenericFilter (list, "getName", adapter);

现在唯一缺少的是重写适配器类中的“getFilter”方法:@Override public Filter getFilter () {

return MyViewClass.this.mFilter;}

全都做完了!你应该成功过滤你的名单-当然,你也应该实现你的过滤算法最好的方式来描述你的需要,下面的代码只是一个例子。..希望能帮上忙保重。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值