在项目中,我们自定义了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
具体项目设计代码如下:
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
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货