CursorAdapter не всегда работает с AutoCompleteTextView

У меня проблема с реализацией CursorAdapter для AutoCompleteTextView.

ZipCode: _ (<- EditText)
Город: ____ (<- AutoCompleteTextView)
В основном, я хочу помочь пользователю, предлагая доступные города для введенного почтового индекса. Моя проблема в том, что предложения не отображаются (Курсор не запускает запрос, я думаю). Что я не понимаю, так это почему это работает в некоторых случаях, а не в других. Я прикрепляю неисправный корпус ниже.

Мой Курсор Адаптер:

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;
}

Код в моей деятельности:

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);
    }

Спасибо за ваши ответы и извините за длинный пост. Любой намек будет очень признателен.

1 ответ

Решение

Вы не упомянули по крайней мере один из случаев, когда фильтрация не удалась, поэтому строки, приведенные ниже, больше следуют предположениям:

Я думаю, вы неправильно настроили фильтрацию. Нет необходимости устанавливать адаптер каждый раз, когда пользователь вводит код, более простым решением было бы наличие поля в классе активности, 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;
}

Наконец, вы, вероятно, сделали это, но убедитесь, что вы получаете то, что ожидаете, когда запрашиваете (напрямую) базу данных. Поскольку фильтрация работает в некоторых случаях, возможно, есть о чем позаботиться.

Другие вопросы по тегам