在项目中,我们自定义了ReserveHeaderAdapter继承ArrayAdapter,用于包含根据需要刷新的progress bar和search bar.对于search bar(实际就是EditText),我们用Textwatcher获取输入的字符并做相应的filter,以达到搜索相关内容的目的。在其它Android手机上运行结果很理想,但在Note II上却出现了问题。
具体项目设计代码如下:
1. 在HeaderAdapter中
@Override
public View getView(final int position, final View convertView, final ViewGroup parent)
{
    View rowView = null;    
    //enum:HeaderItem, Map<Integer, HeaderItem>:mHeaderDef分别储存refresh bar和search bar数据    
    HeaderItem header = mHeaderDef.get(position);
        if (header != null)
        {
            switch(header)
            {
                case REFRESHBAR:
                {
                    rowView = updateRefreshRow(convertView, parent);
                    break;
                }
                case SEARCHBAR:
                {
                    rowView = updateSearchRow(convertView, parent);
                    break;
                }
                default:
                {       
                    rowView = super.getView(position, convertView, parent);
                    break;
                }
            }
        }
        else
        {
            rowView = super.getView(position, convertView, parent);
        }
        return rowView;}
private View updateRefreshRow(final View convertView, final ViewGroup parent)
{
     mCacheRefreshView = this.mAllContentInflator.inflate( R.layout.refresh_bar_item, parent, false );
     //mTopRefreshButton = (Button) mCacheRefreshView.findViewById(R.id.refresh_button);
     //mTopRefreshButton.setOnClickListener(getClickRefreshListener());
     mProcessRefresh = (ProgressBar) mCacheRefreshView.findViewById(R.id.process_refresh);
    
     switch(mRefreshStatus)
     {
     case IDLE:
     //showTopRefresh();
     hideTopRefresh();
     break;
     case REFRESHING:
     showProcessRefresh();
     break;
     }
     if ((mEditText != null) && getSearchVarString().trim().length()>0))
     {
     mEditText.requestFocus();
     }    
     }
        //View: mCacheRefreshView优化Adapter启动性能
return mCacheRefreshView;
    }
其子类:AllContentAdapterpublic class AllContentAdapter extends ReserveHeaderAdapter 
{
public AllContentAdapter(Activity callerContext,
        MediaObjectManager manager, boolean sensitive,
        MediaPolicy displayPolicy) {
    super(callerContext, manager, sensitive, displayPolicy);
    // TODO Auto-generated constructor stub
    super.appendHeaderItem(HeaderItem.REFRESHBAR);
    super.appendHeaderItem(HeaderItem.SEARCHBAR);
}private static OnKeyListener mOnKeySearchListener = null;   
private static TextWatcher mSearchTextWatcher = null;
private static OnClickListener mOnClickRefreshListener = null;
private static String mSearchString = "";
@Override
protected String getSearchVarString()
{
    return mSearchString;
}@Override
protected void setSearchVarString(String searchString)
{
    mSearchString = searchString;
}@Override
protected OnKeyListener getSearchListener()
{
    return mOnKeySearchListener;
}@Override
protected TextWatcher getSearchTextWatcher()
{
    return mSearchTextWatcher;
}@Override
protected OnClickListener getClickRefreshListener()
{
    return mOnClickRefreshListener;
}public void setOnClickRefreshListener(OnClickListener listener)
{
    mOnClickRefreshListener = listener;
}public void setSearchOnKeyListener(OnKeyListener listener)
{
    mOnKeySearchListener = listener;
}public void addTextChangedListenerForSearch(TextWatcher listener)
{
    mSearchTextWatcher = listener;      
}所以在Main Activity中,我定义并加载了adapter.addTextChangedListenerForSearch(new TextWatcher()),代码如下:((AllContentAdapter) mAdapter).addTextChangedListenerForSearch(new TextWatcher()
    {        public void afterTextChanged(Editable s)
        {
            String stxt = s.toString();
            ((AllContentAdapter) mAdapter).setSearchVarString(stxt);            // some handle code omitted...            AllContentScreen.this.loadSearchFilter();// do some filter to search desired content
        }        public void beforeTextChanged(CharSequence s, int start, int count, int after)
        {
        }        public void onTextChanged(CharSequence s, int start, int before, int count)
        {
        }
    });
其他的机器上这些处理都可以正常运行,但在NOTE II上,当你输入第一个字符后,紧接着再输入第二个,afterTextChanged(Editable s)中的s却无法获取任何输入字符,而且还把前面输入的第一个字符也清空了,stxt得到的只能是空字符串了。显然,这是不准确的。
不知哪位大侠知道解决方案啊,万分感谢啊Android