publicabstractclass
Filter
extendsObject
java.lang.Object
android.widget.Filter
ClassOverview
关键字过滤器android.widget.Filterconstrainsdatawithafilteringpattern.
FiltersareusuallycreatedbyFilterableclasses.
Filteringoperationsperformedbycallingfilter(CharSequence)orfilter(CharSequence,android.widget.Filter.FilterListener)areperformedasynchronously.
Whenthesemethodsarecalled,afilteringrequestispostedinarequestqueueandprocessedlater.
Anycalltooneofthesemethodswillcancelanypreviousnon-executedfilteringrequest.
注意1:Filter是个虚类。系统并没对外提供了的Filter类的实现,它只是内部实现了一些Filter类。Filter应该在UI线程中被创建。
注意2:Filter是对外提供filter(CharSequence)orfilter(CharSequence,android.widget.Filter.FilterListener)来进行过滤。而且这两个函数是异步的。在调用这两个方法后,以前还未执行的过滤命令(它也通过调用者两个函数)将被取消。
主要函数:
publicCharSequenceconvertResultToString(ObjectresultValue)
Since:APILevel1
ConvertsavaluefromthefilteredsetintoaCharSequence.Subclassesshouldoverridethismethodtoconverttheirresults.ThedefaultimplementationreturnsanemptyStringfornullvaluesorthedefaultStringrepresentationofthevalue.
Parameters
resultValuethevaluetoconverttoaCharSequence
Returns
*aCharSequencerepresentingthevalue
注1:该函数就是提供了把结果转化成字符串的功能。子类可以重载它。
publicfinalvoidfilter(CharSequenceconstraint,Filter.FilterListenerlistener)
Since:APILevel1
Startsanasynchronousfilteringoperation.Callingthismethodcancelsallpreviousnon-executedfilteringrequestsandpostsanewfilteringrequestthatwillbeexecutedlater.
Uponcompletion,thelistenerisnotified.
Parameters
constrainttheconstraintusedtofilterthedata
listeneralistenernotifieduponcompletionoftheoperation
注1:constraint是过滤的关键字。
注2:listener就是在过滤操作的一个监听器。当过滤完成时调用listener的onFilterComplete(intcount)。这里的count表示查询到的数据项的数量。
publicfinalvoidfilter(CharSequenceconstraint)
Since:APILevel1
Startsanasynchronousfilteringoperation.Callingthismethodcancelsallpreviousnon-executedfilteringrequestsandpostsanewfilteringrequestthatwillbeexecutedlater.
Parameters
constrainttheconstraintusedtofilterthedata
注1:constraint是过滤的关键字。
Protected的且需要实现的方法:
protectedabstractFilter.FilterResultsperformFiltering(CharSequenceconstraint)
Since:APILevel1
Invokedinaworkerthreadtofilterthedataaccordingtotheconstraint.Subclassesmustimplementthismethodtoperformthefilteringoperation.ResultscomputedbythefilteringoperationmustbereturnedasaFilter.FilterResultsthatwillthenbepublishedintheUIthreadthroughpublishResults(CharSequence,android.widget.Filter.FilterResults).
Contract:Whentheconstraintisnull,theoriginaldatamustberestored.
参数
constrainttheconstraintusedtofilterthedata
Returns
*theresultsofthefilteringoperation
注1:该方法是个虚方法。
注2:该方法是在一个工作线程中执行的。它的任务就是根据关键字constraint来返回数据和数据的个数。
它们分别对应于Filter.FilterResults的成员变量publicintcount和publicObjectvalues
protectedabstractvoidpublishResults(CharSequenceconstraint,Filter.FilterResultsresults)
Since:APILevel1
InvokedintheUIthreadtopublishthefilteringresultsintheuserinterface.SubclassesmustimplementthismethodtodisplaytheresultscomputedinperformFiltering(CharSequence).
参数
constrainttheconstraintusedtofilterthedata
resultstheresultsofthefilteringoperation
注1:该方法是虚方法。并且该方法是在创建Filter的线程中被执行,它一般用来做些UI方面的操作。如果Filter应该在UI线程中被创建,那么该函数就是UIthread中被执行了。
注意1:关于的实现可以参考CursorFilter。
Filter的源码摘要如下:
http://hi-android.info/src/android/widget/Filter.java.html
packageandroid.widget;
publicabstractclassFilter{
privatestaticfinalStringLOG_TAG="Filter";
privatestaticfinalStringTHREAD_NAME="Filter";
privatestaticfinalintFILTER_TOKEN=0xD0D0F00D;
privatestaticfinalintFINISH_TOKEN=0xDEADBEEF;
privateHandlermThreadHandler;
privateHandlermResultHandler;
privateDelayermDelayer;
privatefinalObjectmLock=newObject();
/**
*<p>Createsanewasynchronousfilter.</p>
*/
publicFilter(){
mResultHandler=newResultsHandler();
}
-----------------------------------省略----------------------------------------------------------
publicvoidsetDelayer(Delayerdelayer){
synchronized(mLock){
mDelayer=delayer;
}
}
-----------------------------------省略----------------------------------------------------------
publicfinalvoidfilter(CharSequenceconstraint){
filter(constraint,null);
}
-----------------------------------省略----------------------------------------------------------
publicfinalvoidfilter(CharSequenceconstraint,FilterListenerlistener){
synchronized(mLock){
if(mThreadHandler==null){
HandlerThreadthread=newHandlerThread(
THREAD_NAME,android.os.Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
mThreadHandler=newRequestHandler(thread.getLooper());
}
finallongdelay=(mDelayer==null)?0:mDelayer.getPostingDelay(constraint);
Messagemessage=mThreadHandler.obtainMessage(FILTER_TOKEN);
RequestArgumentsargs=newRequestArguments();
//makesureweuseanimmutablecopyoftheconstraint,sothat
//itdoesn'tchangewhilethefilteroperationisinprogress
args.constraint=constraint!=null?constraint.toString():null;
args.listener=listener;
message.obj=args;
mThreadHandler.removeMessages(FILTER_TOKEN);
mThreadHandler.removeMessages(FINISH_TOKEN);
mThreadHandler.sendMessageDelayed(message,delay);
}
}
-----------------------------------省略----------------------------------------------------------
protectedabstractFilterResultsperformFiltering(CharSequenceconstraint);
-----------------------------------省略----------------------------------------------------------
protectedabstractvoidpublishResults(CharSequenceconstraint,
FilterResultsresults);
-----------------------------------省略----------------------------------------------------------
publicCharSequenceconvertResultToString(ObjectresultValue){
returnresultValue==null?"":resultValue.toString();
}
-----------------------------------省略----------------------------------------------------------
protectedstaticclassFilterResults{
-----------------------------------省略----------------------------------------------------------
publicObjectvalues;
-----------------------------------省略----------------------------------------------------------
publicintcount;
}
-----------------------------------省略----------------------------------------------------------
publicstaticinterfaceFilterListener{
-----------------------------------省略----------------------------------------------------------
publicvoidonFilterComplete(intcount);
}
-----------------------------------省略----------------------------------------------------------
privateclassRequestHandlerextendsHandler{
publicRequestHandler(Looperlooper){
super(looper);
}
-----------------------------------省略----------------------------------------------------------
publicvoidhandleMessage(Messagemsg){
intwhat=msg.what;
Messagemessage;
switch(what){
caseFILTER_TOKEN:
RequestArgumentsargs=(RequestArguments)msg.obj;
try{
args.results=performFiltering(args.constraint);
}catch(Exceptione){
args.results=newFilterResults();
Log.w(LOG_TAG,"AnexceptionoccuredduringperformFiltering()!",e);
}finally{
message=mResultHandler.obtainMessage(what);
message.obj=args;
message.sendToTarget();
}
synchronized(mLock){
if(mThreadHandler!=null){
MessagefinishMessage=mThreadHandler.obtainMessage(FINISH_TOKEN);
mThreadHandler.sendMessageDelayed(finishMessage,3000);
}
}
break;
caseFINISH_TOKEN:
synchronized(mLock){
if(mThreadHandler!=null){
mThreadHandler.getLooper().quit();
mThreadHandler=null;
}
}
break;
}
}
}
/**
*<p>Handlestheresultsofafilteringoperation.Theresultsare
*handledintheUIthread.</p>
*/
privateclassResultsHandlerextendsHandler{
/**
*<p>Messagesreceivedfromtherequesthandlerareprocessedinthe
*UIthread.Theprocessinginvolvescalling
*{@linkFilter#publishResults(CharSequence,
*android.widget.Filter.FilterResults)}
*toposttheresultsbackintheUIandthennotifyingthelistener,
*ifany.</p>
*
*@parammsgthefilteringresults
*/
@Override
publicvoidhandleMessage(Messagemsg){
RequestArgumentsargs=(RequestArguments)msg.obj;
publishResults(args.constraint,args.results);
if(args.listener!=null){
intcount=args.results!=null?args.results.count:-1;
args.listener.onFilterComplete(count);
}
}
}
-----------------------------------省略----------------------------------------------------------
privatestaticclassRequestArguments{
/**
*<p>Theconstraintusedtofilterthedata.</p>
*/
CharSequenceconstraint;
/**
*<p>Thelistenertonotifyuponcompletion.Canbenull.</p>
*/
FilterListenerlistener;
/**
*<p>Theresultsofthefilteringoperation.</p>
*/
FilterResultsresults;
}
/**
*@hide
*/
publicinterfaceDelayer{
/**
*@paramconstraintTheconstraintpassedto{@linkFilter#filter(CharSequence)}
*@returnThedelaythatshouldbeusedfor
*{@linkHandler#sendMessageDelayed(android.os.Message,long)}
*/
longgetPostingDelay(CharSequenceconstraint);
}
}
注意:如果在完成一个过滤任何后,3000毫秒的时间内没有新的过滤任务请求的话,mThreadHandler会消亡。
在新的过滤任务到来时如果mThreadHandler已经消亡,那么就重新创建一个新的mThreadHandler。
Filter
extendsObject
java.lang.Object
android.widget.Filter
ClassOverview
关键字过滤器android.widget.Filterconstrainsdatawithafilteringpattern.
FiltersareusuallycreatedbyFilterableclasses.
Filteringoperationsperformedbycallingfilter(CharSequence)orfilter(CharSequence,android.widget.Filter.FilterListener)areperformedasynchronously.
Whenthesemethodsarecalled,afilteringrequestispostedinarequestqueueandprocessedlater.
Anycalltooneofthesemethodswillcancelanypreviousnon-executedfilteringrequest.
注意1:Filter是个虚类。系统并没对外提供了的Filter类的实现,它只是内部实现了一些Filter类。Filter应该在UI线程中被创建。
注意2:Filter是对外提供filter(CharSequence)orfilter(CharSequence,android.widget.Filter.FilterListener)来进行过滤。而且这两个函数是异步的。在调用这两个方法后,以前还未执行的过滤命令(它也通过调用者两个函数)将被取消。
主要函数:
publicCharSequenceconvertResultToString(ObjectresultValue)
Since:APILevel1
ConvertsavaluefromthefilteredsetintoaCharSequence.Subclassesshouldoverridethismethodtoconverttheirresults.ThedefaultimplementationreturnsanemptyStringfornullvaluesorthedefaultStringrepresentationofthevalue.
Parameters
resultValuethevaluetoconverttoaCharSequence
Returns
*aCharSequencerepresentingthevalue
注1:该函数就是提供了把结果转化成字符串的功能。子类可以重载它。
publicfinalvoidfilter(CharSequenceconstraint,Filter.FilterListenerlistener)
Since:APILevel1
Startsanasynchronousfilteringoperation.Callingthismethodcancelsallpreviousnon-executedfilteringrequestsandpostsanewfilteringrequestthatwillbeexecutedlater.
Uponcompletion,thelistenerisnotified.
Parameters
constrainttheconstraintusedtofilterthedata
listeneralistenernotifieduponcompletionoftheoperation
注1:constraint是过滤的关键字。
注2:listener就是在过滤操作的一个监听器。当过滤完成时调用listener的onFilterComplete(intcount)。这里的count表示查询到的数据项的数量。
publicfinalvoidfilter(CharSequenceconstraint)
Since:APILevel1
Startsanasynchronousfilteringoperation.Callingthismethodcancelsallpreviousnon-executedfilteringrequestsandpostsanewfilteringrequestthatwillbeexecutedlater.
Parameters
constrainttheconstraintusedtofilterthedata
注1:constraint是过滤的关键字。
Protected的且需要实现的方法:
protectedabstractFilter.FilterResultsperformFiltering(CharSequenceconstraint)
Since:APILevel1
Invokedinaworkerthreadtofilterthedataaccordingtotheconstraint.Subclassesmustimplementthismethodtoperformthefilteringoperation.ResultscomputedbythefilteringoperationmustbereturnedasaFilter.FilterResultsthatwillthenbepublishedintheUIthreadthroughpublishResults(CharSequence,android.widget.Filter.FilterResults).
Contract:Whentheconstraintisnull,theoriginaldatamustberestored.
参数
constrainttheconstraintusedtofilterthedata
Returns
*theresultsofthefilteringoperation
注1:该方法是个虚方法。
注2:该方法是在一个工作线程中执行的。它的任务就是根据关键字constraint来返回数据和数据的个数。
它们分别对应于Filter.FilterResults的成员变量publicintcount和publicObjectvalues
protectedabstractvoidpublishResults(CharSequenceconstraint,Filter.FilterResultsresults)
Since:APILevel1
InvokedintheUIthreadtopublishthefilteringresultsintheuserinterface.SubclassesmustimplementthismethodtodisplaytheresultscomputedinperformFiltering(CharSequence).
参数
constrainttheconstraintusedtofilterthedata
resultstheresultsofthefilteringoperation
注1:该方法是虚方法。并且该方法是在创建Filter的线程中被执行,它一般用来做些UI方面的操作。如果Filter应该在UI线程中被创建,那么该函数就是UIthread中被执行了。
注意1:关于的实现可以参考CursorFilter。
Filter的源码摘要如下:
http://hi-android.info/src/android/widget/Filter.java.html
packageandroid.widget;
publicabstractclassFilter{
privatestaticfinalStringLOG_TAG="Filter";
privatestaticfinalStringTHREAD_NAME="Filter";
privatestaticfinalintFILTER_TOKEN=0xD0D0F00D;
privatestaticfinalintFINISH_TOKEN=0xDEADBEEF;
privateHandlermThreadHandler;
privateHandlermResultHandler;
privateDelayermDelayer;
privatefinalObjectmLock=newObject();
/**
*<p>Createsanewasynchronousfilter.</p>
*/
publicFilter(){
mResultHandler=newResultsHandler();
}
-----------------------------------省略----------------------------------------------------------
publicvoidsetDelayer(Delayerdelayer){
synchronized(mLock){
mDelayer=delayer;
}
}
-----------------------------------省略----------------------------------------------------------
publicfinalvoidfilter(CharSequenceconstraint){
filter(constraint,null);
}
-----------------------------------省略----------------------------------------------------------
publicfinalvoidfilter(CharSequenceconstraint,FilterListenerlistener){
synchronized(mLock){
if(mThreadHandler==null){
HandlerThreadthread=newHandlerThread(
THREAD_NAME,android.os.Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
mThreadHandler=newRequestHandler(thread.getLooper());
}
finallongdelay=(mDelayer==null)?0:mDelayer.getPostingDelay(constraint);
Messagemessage=mThreadHandler.obtainMessage(FILTER_TOKEN);
RequestArgumentsargs=newRequestArguments();
//makesureweuseanimmutablecopyoftheconstraint,sothat
//itdoesn'tchangewhilethefilteroperationisinprogress
args.constraint=constraint!=null?constraint.toString():null;
args.listener=listener;
message.obj=args;
mThreadHandler.removeMessages(FILTER_TOKEN);
mThreadHandler.removeMessages(FINISH_TOKEN);
mThreadHandler.sendMessageDelayed(message,delay);
}
}
-----------------------------------省略----------------------------------------------------------
protectedabstractFilterResultsperformFiltering(CharSequenceconstraint);
-----------------------------------省略----------------------------------------------------------
protectedabstractvoidpublishResults(CharSequenceconstraint,
FilterResultsresults);
-----------------------------------省略----------------------------------------------------------
publicCharSequenceconvertResultToString(ObjectresultValue){
returnresultValue==null?"":resultValue.toString();
}
-----------------------------------省略----------------------------------------------------------
protectedstaticclassFilterResults{
-----------------------------------省略----------------------------------------------------------
publicObjectvalues;
-----------------------------------省略----------------------------------------------------------
publicintcount;
}
-----------------------------------省略----------------------------------------------------------
publicstaticinterfaceFilterListener{
-----------------------------------省略----------------------------------------------------------
publicvoidonFilterComplete(intcount);
}
-----------------------------------省略----------------------------------------------------------
privateclassRequestHandlerextendsHandler{
publicRequestHandler(Looperlooper){
super(looper);
}
-----------------------------------省略----------------------------------------------------------
publicvoidhandleMessage(Messagemsg){
intwhat=msg.what;
Messagemessage;
switch(what){
caseFILTER_TOKEN:
RequestArgumentsargs=(RequestArguments)msg.obj;
try{
args.results=performFiltering(args.constraint);
}catch(Exceptione){
args.results=newFilterResults();
Log.w(LOG_TAG,"AnexceptionoccuredduringperformFiltering()!",e);
}finally{
message=mResultHandler.obtainMessage(what);
message.obj=args;
message.sendToTarget();
}
synchronized(mLock){
if(mThreadHandler!=null){
MessagefinishMessage=mThreadHandler.obtainMessage(FINISH_TOKEN);
mThreadHandler.sendMessageDelayed(finishMessage,3000);
}
}
break;
caseFINISH_TOKEN:
synchronized(mLock){
if(mThreadHandler!=null){
mThreadHandler.getLooper().quit();
mThreadHandler=null;
}
}
break;
}
}
}
/**
*<p>Handlestheresultsofafilteringoperation.Theresultsare
*handledintheUIthread.</p>
*/
privateclassResultsHandlerextendsHandler{
/**
*<p>Messagesreceivedfromtherequesthandlerareprocessedinthe
*UIthread.Theprocessinginvolvescalling
*{@linkFilter#publishResults(CharSequence,
*android.widget.Filter.FilterResults)}
*toposttheresultsbackintheUIandthennotifyingthelistener,
*ifany.</p>
*
*@parammsgthefilteringresults
*/
@Override
publicvoidhandleMessage(Messagemsg){
RequestArgumentsargs=(RequestArguments)msg.obj;
publishResults(args.constraint,args.results);
if(args.listener!=null){
intcount=args.results!=null?args.results.count:-1;
args.listener.onFilterComplete(count);
}
}
}
-----------------------------------省略----------------------------------------------------------
privatestaticclassRequestArguments{
/**
*<p>Theconstraintusedtofilterthedata.</p>
*/
CharSequenceconstraint;
/**
*<p>Thelistenertonotifyuponcompletion.Canbenull.</p>
*/
FilterListenerlistener;
/**
*<p>Theresultsofthefilteringoperation.</p>
*/
FilterResultsresults;
}
/**
*@hide
*/
publicinterfaceDelayer{
/**
*@paramconstraintTheconstraintpassedto{@linkFilter#filter(CharSequence)}
*@returnThedelaythatshouldbeusedfor
*{@linkHandler#sendMessageDelayed(android.os.Message,long)}
*/
longgetPostingDelay(CharSequenceconstraint);
}
}
注意:如果在完成一个过滤任何后,3000毫秒的时间内没有新的过滤任务请求的话,mThreadHandler会消亡。
在新的过滤任务到来时如果mThreadHandler已经消亡,那么就重新创建一个新的mThreadHandler。