4

私は Android の世界の初心者で、2.1 Google API に基づいて小さなトレーニング SW を作成しました。

当時はまだメイン スレッドとワーカー スレッドについて知らなかったので、すべてのコードをメイン スレッドに入れました。

それ以来、4.0 Google API に適合するように、ネットワーク アクセス用の非同期クラスで修正しました。

わかりましたが、最後に気になることが 1 つあります。手がかりが見つかりません。

フィールドville (フランス語で「町」)のAutoCompleteTextViewについてです。


前 (2.1):

public void onTextChanged(CharSequence s, int start, int before, int count) 
{
String result = null;
InputStream is = null;
List<String> r = new ArrayList<String>();

    if (ville.enoughToFilter())
    {
        is = connexionHttp(BASE_URL + "ville.php?ville=" + ville.getText());
        result = lectureData(is);

        try
        {           
            JSONArray jArray = new JSONArray(result);
            JSONObject json_data=null;
            for(int i=0;i<jArray.length();i++)
            {
                   json_data = jArray.getJSONObject(i);  
                   r.add(json_data.getString("VILLE"));
                   a_idVil.add(json_data.getString("CLEF_VILLE"));      
            }
            ville.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_selectable_list_item,r));
            ville.setOnItemSelectedListener(new villeListener());

        }
        catch(JSONException e1)
        {
                Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
                Log.d("***** TestActivity/onTextChanged: JSONException *****", "--"+e1.toString()+"--");
        } 
        catch(ParseException e1) 
        {
                Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
                Log.d("***** TestActivity/onTextChanged: ParseException *****", "--"+e1.toString()+"--");
        }
    }
}
public class villeListener implements OnItemSelectedListener 
{
    public void onItemSelected(AdapterView<?> parent, View v, int pos, long row) 
    {
        villePosition = pos;    
    }
    public void onNothingSelected(AdapterView<?> arg0)  {   }
}

100% 完璧に実行されます:

-> 4 番目の文字の後、MySql でクエリが実行され、指定された 4 文字で始まるすべての町が検索され、選択リストが表示されて正しいものが選択されます: OK

-> リスナーが選択した町のインデックスを与える: OK


アフター (4.0)

public void onTextChanged(CharSequence s, int start, int before, int count) 
{           
if (ville.enoughToFilter())
{           
    new RemplirVille().execute(BASE_URL + "ville.php?ville=" + ville.getText());
    Log.d("***********","AVANT");  
    ville.setOnItemSelectedListener(new villeListener());
    Log.d("***********","APRES");           
}

}
public class villeListener implements OnItemSelectedListener 
{
public void onItemSelected(AdapterView<?> parent, View v, int pos, long row) 
{
    villePosition = pos;
    Log.d("*************9999999", "1111111111");
}
public void onNothingSelected(AdapterView<?> arg0)  {   }
}

class RemplirVille extends AsyncTask<String, String, List<String>>
{
Integer errorMsgId;
String  errorMsgParam;

protected List<String> doInBackground(String... param)
{
    List<String> listeAffichageVille = new ArrayList<String>();
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

    try 
    {
             HttpClient httpclient = new DefaultHttpClient();      
             HttpPost httppost = new HttpPost(param[0]);
             httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
             HttpResponse response = httpclient.execute(httppost);     
             if (response.getStatusLine().getStatusCode() < 400) 
             {
                  HttpEntity entity = response.getEntity();
                  String entityStr = EntityUtils.toString(entity);
                  JSONArray json_array = new JSONArray(entityStr);

                  for(int i=0;i<json_array.length();i++) 
                  {
                      JSONObject json_ligne = json_array.getJSONObject(i);                            
                      listeAffichageVille.add(json_ligne.getString("VILLE"));
                      a_idVil.add(json_ligne.getString("CLEF_VILLE"));
                  }
            } 
            else 
            {
                Log.d("***** TestActivity/ASYNC RemplirVille: EXCEPTION http error *****", "--"+response.getStatusLine().toString()+"--"); 
                this.errorMsgId = R.string.http_site_error;
                listeAffichageVille = null;
            }
    } 
    catch (Exception ex) 
    {
            Log.d("***** TestActivity/ASYNC RemplirVille: EXCEPTION decode error *****", "--"+ex.toString()+"--");
            this.errorMsgId = R.string.http_decode_error;
            this.errorMsgParam = ex.getLocalizedMessage();
            listeAffichageVille = null;
    }
    return listeAffichageVille;
}

protected void onProgressUpdate(String... item) {   }
protected void onPreExecute(List<String> list)  {   }
protected void onPostExecute(List<String> list)     
{               
    if (list == null)
    {
          if (this.errorMsgId != null) 
          {
              String msg = TestActivity.this.getString(this.errorMsgId);
              Toast.makeText(TestActivity.this,msg,Toast.LENGTH_LONG).show();
          }    
    }
    else            
    {
        ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list));
    }
}   
}

問題を抱えて実行されます:

-> 町のリストを表示するには、(enoughToFilter + 1) 文字を入力する必要があります: BAD

-> リスナーはもう実行されていません: BAD


実際、十分に機能します。RemplirVilleクラスを起動します。RemplirVille クラスは、リストが表示されないことを除けば問題なく動作します。

しかし、もう 1 文字入れると: -> enoughToFilterはまだうまく機能します -> RemplirVille はもう一度データをもたらします....しかし、今回は選択リストがうまく表示されます。

そのトピックについて何か考えはありますか?コンテキストの問題だと思いますが、GetApplicationCONtext を使用しても取得できません。

ありがとう。

4

1 に答える 1

2

を呼び出しAutoCompleteTextView.setAdapter()てもドロップダウンは自動的に表示されませんが、ドロップダウンを強制的に表示することができますAutoCompleteTextView.showDropDown()

protected void onPostExecute(List<String> list){
    //...
    ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list));
    if(ville.isInputMethodTarget()){
        ville.showDropDown();
    }
    //...
}

これがないと、次の文字が入力されるまでドロップダウンが表示されず、(enoughToFilter + 1) 問題が発生しました。

于 2012-09-22T04:30:01.273 に答える