1

在应用程序中,我有一个扩展 BaseAdapter 的自定义适配器。适配器包括两个项目的标题,其中一个是搜索栏。我要做的是使用我的适配器在栏上输入文本以搜索列表视图上的内容。这里的挑战是三星 Galaxy Note II,当我输入一个字符时,搜索栏会显示它是什么。但是,对于我要输入的第二个字符,该栏没有显示任何内容,并且似乎前一个字符也被清除了。对于任何其他设备,这都很好。我对此一无所知。任何大师都可以知道解决方案吗?

下面是 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;      
}

因此,对于所需的 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 上,当输入第二个字符时,(Editable)s 会捕捉到注意但为空的字符串。为什么?

4

2 回答 2

0

从调试过程中,我可能发现了这个特殊设备的问题并因此解决了这个问题。也就是说,当 EditText.getText().getString() 不为空时,我们将显示搜索栏和 setSelection(position)。这里的“位置”代表搜索栏。对于任何其他设备,这都可以正常工作。对于Note II,似乎如果我们想对EditText的位置进行setSelection,该函数将清除输入的文本并返回空字符串。因此解决方案是通过使用标志来查看 EditText 是否有空字符串并捕获在搜索栏中输入的内容来避免此功能。

于 2013-05-01T20:11:24.560 回答
0

那很奇怪。我敢打赌,Note 使用了特殊的 InputConnection。http://developer.android.com/reference/android/view/inputmethod/BaseInputConnection.html

生成自定义可编辑项。您可能希望在搜索 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 回答