1

我在AutoCompleteTextView上实现CursorAdapter时出现问题。CursorAdapter并非总是在AutoCompleteTextView上工作

邮编:_(< --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); 
    } 

感谢您的回复,并对长篇文章感到抱歉。任何提示将非常感激。

+0

我正在做类似的事情! http://stackoverflow.com/questions/12854336/autocompletetextview-backed-by-cursorloader – toobsco42

回答

2

你不提的,其中过滤失败所以下面的线从猜测带来了更多的案件中至少一个:

我想你设置过滤错误。每当用户输入代码时都不需要设置适配器,更简单的解决方案是在活动类中有一个字段,即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; 
} 

最后,你可能这样做,但一定要确保你得到你所期望的查询时(直接)的数据库。由于某些情况下的过滤工作可能需要处理。

+0

非常感谢@Luksprog。事实上,多次设置适配器不是解决方案。我只调用一次,然后在我的'runQueryOnBackgroundThread'中得到EditText的值(在我的情况下是ZipCode),它的效果很好。你的回答很有帮助,谢谢。 – cosmincalistru