アプリケーションには、BaseAdapter を拡張するカスタマイズされたアダプターがあります。アダプターには 2 つの項目のヘッダーが含まれており、そのうちの 1 つは検索バーです。私がやろうとしているのは、アダプターを使用して、リストビューのコンテンツを検索するためにバーにテキストを入力することです。ここでの課題は、Samsung Galaxy Note II です。文字を入力すると、検索バーにその文字が表示されます。ただし、入力したい2番目の文字については、バーには何も表示されず、前の文字もクリアされたようです。他のデバイスの場合、これはうまく機能します。私にはこれがわかりません。解決策を知っている教祖はいますか?
ResearveHeaderAdapter のスニペットを次に示します。
@Override
public View getView(final int position, final View convertView, final ViewGroup parent)
{
View rowView = null;
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 updateSearchRow(final View convertView, final ViewGroup parent)
{
mCacheSearchView = mAllContentInflator.inflate( R.layout.search_bar_item, parent, false );
mEditText = (ClearableEditText) mCacheSearchView.findViewById(R.id.topSearchBar);
mEditText.setText(getSearchVarString());
mEditText.setOnKeyListener(getSearchListener());
mEditText.addTextChangedListener(getSearchTextWatcher());
String search = getSearchVarString();
String stxt = mEditText.getText().toString();
if (getSearchVarString().trim().length() > 0)
{
mEditText.requestFocus();
}
mEditText.setEnabled(true);
return mCacheSearchView;
}
そのサブクラス AllContentAdapter:
public 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;
}
したがって、目的のアクティビティに対して、次の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 で 2 番目の文字を入力すると、(Editable)s は注意をキャッチしますが、空の文字列です。なんで?