1

アプリケーションには、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 は注意をキャッチしますが、空の文字列です。なんで?

4

2 に答える 2

0

それは奇妙だ。Note が特別な InputConnection を使用していることは間違いありません。http://developer.android.com/reference/android/view/inputmethod/BaseInputConnection.html

カスタム Editables を生成します。検索 EditText にカスタム Editable.Factory を設定したい場合があります。また、SpanWatcher を設定してスパン アクティビティ、特にスパンの構成を監視することも検討してください。これは、私が作成したRichEditText ライブラリの例です。

// Replaces the default edit text factory that produces editables
// which our custom editable and listener
public class TextFactory extends Editable.Factory{


    @Override
    public Editable newEditable(final CharSequence source){

        return new RichTextStringBuilder(source,
                                         mSpanWatcher);
    }

}

少なくとも、これにより、何が起こっているかをよりよく把握できます。

于 2013-04-24T22:06:05.863 に答える
0

デバッグプロセスから、おそらくこの特別なデバイスの問題が何であるかを発見し、この問題を解決しました. つまり、EditText.getText().getString() が空でない場合、検索バーと setSelection(position) が表示されます。ここでの「位置」は検索バーを表します。他のデバイスの場合、これは正常に機能します。Note II の場合、EditText の位置に setSelection が必要な場合、この関数は入力されたテキストをクリアし、空の文字列を返すようです。したがって、解決策は、フラグを使用して EditText に空の文字列があるかどうかを確認し、検索バーに入力された内容をキャッチして、この関数を回避することです。

于 2013-05-01T20:11:24.560 に答える