android - CursorAdapter 并不总是在 AutoCompleteTextView 上工作

标签 android sqlite autocompletetextview android-cursoradapter

我在 AutoCompleteTextView 上实现 CursorAdapter 时遇到问题。

邮政编码:_ (<--EditText)
城市:____(<-- AutoCompleteTextView)
基本上,我想帮助用户为输入的邮政编码建议可用的城市。 我的问题是没有显示建议(我猜 Cursor 没有启动查询)。我不明白的是为什么它在某些情况下有效而在其他情况下无效。我在下面附上故障案例。

我的光标适配器:

public class SearchCursorAdapter extends CursorAdapter {

    private DataBaseHelper mDbHelper;
    private String codePostal;

    public SearchCursorAdapter(DataBaseHelper dbHelper, Context context,
            String codePostal) {
        // Call the CursorAdapter constructor with a null Cursor.
        super(context, null, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        mDbHelper = dbHelper;
        this.codePostal = codePostal;
    }

    @Override
    public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
        if (getFilterQueryProvider() != null) {
            return getFilterQueryProvider().runQuery(constraint);
        }

        Cursor cursor = mDbHelper.getStationCursor(constraint.toString(),
                codePostal);
        return cursor;
    }

    @Override
    public String convertToString(Cursor cursor) {
        return cursor.getString(1); //second column in select
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        ((TextView) view).setText(cursor.getString(1)); //second column in select
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.spinner_layout, null);
        return view;
    }
}

数据库适配器的选择方法:

public Cursor getStationCursor(String args, String arg2) {



StringBuffer sqlQuery = new StringBuffer("");
    Cursor result = null;

    sqlQuery.append(" SELECT min(_id) as _id, ");
    sqlQuery.append(CITIES.CITY);
    sqlQuery.append(" FROM ");
    sqlQuery.append(CITIES.TABLE_NAME);
    sqlQuery.append(" WHERE ");
    sqlQuery.append(CITIES.CITY);
    sqlQuery.append(" LIKE '");
    sqlQuery.append(args);
    sqlQuery.append("%' ");
    sqlQuery.append("AND ");
    sqlQuery.append(CITIES.CODE_POSTAL);
    sqlQuery.append(" LIKE '");
    sqlQuery.append(arg2);
    sqlQuery.append("%' ");
    sqlQuery.append(" GROUP BY ");
    sqlQuery.append(CITIES.CITY);
    sqlQuery.append(" ORDER BY ");
    sqlQuery.append(CITIES.CITY);
    sqlQuery.append(" LIMIT 10 ");

    if (myDataBase != null) {
        result = myDataBase.rawQuery(sqlQuery.toString(), null);
    }
    if (result != null) {
        result.moveToFirst();
    }
    return result;
}

我 Activity 中的代码:

EditText etCodPost;
AutoCompleteTextView acCity;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout....);
    etCodPost = (EditText) ...;
    acCom = (AutoCompleteTextView) ...;
    setComAdapter(activity);
    etCodPost.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                setComAdapter(activity);
            }
        });
}
private void setComAdapter(Activity activity) {
        SearchCursorAdapter adapt = new SearchCursorAdapter(myDbHelper, activity,
                 etCodPost.getText().toString());

        acCity.setAdapter(adapt);
        acCity.setThreshold(3);
    }

感谢您的回复,很抱歉发了这么长的帖子。任何提示将不胜感激。

最佳答案

您没有提到至少一种过滤失败的情况,因此以下几行更多来自猜测:

我认为您的过滤设置有误。每次用户输入代码时都不需要设置适配器,一个更简单的解决方案是在 Activity 类中有一个字段,一个 int(或 String来自您的代码),这将用作查询的一部分。

@Override
public void afterTextChanged(Editable s) {
     mCode = s.toString;
}

接下来,可以像这样改进适配器级别的过滤:

@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
    if (constraint == null || constraint.toString.equals("")) {
        // this is the contract of this method and should be respected 
        return mDbHelper.getAllCityRecords(); // get all records
    }
    return mDbHelper.getStationCursor(constraint.toString(),
            mCode); // mCode is the field that is updated in the activity class(you should take in consideration that the user could use directly the AutoCompleteTextView, so mCode could be not set at this level)
    return cursor;
}

最后,您可能已经这样做了,但是请确保您在(直接)查询数据库时得到了您期望的结果。由于过滤在某些情况下有效,因此可能需要注意。

关于android - CursorAdapter 并不总是在 AutoCompleteTextView 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12403114/

相关文章:

android - 使用应用程序上下文而不是 Activity 来获取字符串有什么缺点?

android - 是否可以将内部数据库移动到 SDCard?

android - 如何检查 autoCompleteTextView 中的下拉状态(显示或隐藏)?

javascript - 如何使用javascript或jquery拦截Web应用程序的Android数字软键盘上的 "go"按钮

android - 将 Android Cursor 转换为数组的 ArrayList

java - Libgdx 写入文件不起作用?

sql - INNER JOIN 子句在 NATURAL JOIN 执行时不返回任何行

java - SQLException : No suitable driver found for org. sqlite.JDBC

android - 我试图让 AutoCompleteTextView 看起来像一个 Material Edittext

android - 单击 MultiAutoCompleteTextView 时不显示键盘