1

AutoCompleteTextViewにCursorAdapterを実装する際に問題が発生しました。

ZipCode:_(<-EditText)
City:_ ___(<-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;
    }
}

dbアダプタからのselectメソッド:

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

返信ありがとうございます。長い投稿をお詫び申し上げます。ヒントをいただければ幸いです。

4

1 に答える 1

2

フィルタリングが失敗するケースの少なくとも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;
}

最後に、おそらくこれを実行しましたが、データベースに(直接)クエリを実行するときに期待どおりの結果が得られることを確認してください。フィルタリングが機能する場合もあるので、注意が必要な場合があります。

于 2012-09-13T13:00:05.337 に答える