2016-07-16 10 views
0

Ich möchte eine AutoCompleteTextview erstellen, die zuvor gespeicherte Vorschläge aus dem internen Speicher lädt. Ich habe die Strings erfolgreich aus dem internen Speicher in ein String-Array geladen (ich habe das Logging zur Überprüfung benutzt ....).AutoCompleteTextView zeigt keine aus dem internen Speicher geladenen Zeichenfolgen an.

dann wie ich das String-Array auf einen Adapter geladen und den Adapter auf die AutoCompleteTextview setzen, danach zeigt die AutoCompleteTextview nicht die Vorschlag-Strings, die ich aus dem internen Speicher geladen, aber es zeigt die Vorschlags-String (s) was ich zur Laufzeit in das String-Array geladen habe.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //this is the array where i am trying to save my data into 
    loadedString=new String[1]; 
    loadedString[0]="the pre-loaded String" 

    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, loadedString); 


    atcv = (AutoCompleteTextView) findViewById(R.id.autocomplete); 

    int objectCounter = 0;  

    try { 

     FileInputStream fis = this.openFileInput(FILENAME); 
     InputStreamReader isr = new InputStreamReader(fis); 
     BufferedReader br = new BufferedReader(isr); 

     String temp; 


     while ((temp = br.readLine()) != null) { 
     //here i am calculating the lines of my data-file 
     //as 1 line contains 1 string object 
     //so that i can initialize the string array 


     objectCounter++; 
     } 


    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    //intializing the array 
    // objectCounter+1 and index =1 because i loaded an object before 

     loadedString = new String[objectCounter+1]; 

    int index = 1; 


    try { 

     FileInputStream fis = this.openFileInput(FILENAME); 
     InputStreamReader isr = new InputStreamReader(fis); 
     BufferedReader br = new BufferedReader(isr); 


     String temp; 


     while ((temp = br.readLine()) != null) { 


      loadedString[index] = temp; 
      index++; 
     } 


    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 





    adapter.notifyDataSetChanged(); 
    atcv.setAdapter(adapter); 
    atcv.setThreshold(1); 


} 

dies ist die Methode, die ich die Daten helfen

public void saver(View view) { 

     String string; 


     if(actv.getText()!=null){ 
      advice = advices.getText().toString();} 

     advice=advice+"\n"; 


     try{ 

     FileOutputStream fos = openFileOutput(FILENAME, context.MODE_APPEND); 

     fos.write(advice.getBytes()); 
     fos.close(); 
      Toast.makeText(this, "File saved" , Toast.LENGTH_LONG).show(); 

     } 


    catch (Exception e){ 
     Toast.makeText(this, "File could not be saved", Toast.LENGTH_LONG).show(); 
    } 

Bitte sparen verwenden. Beachten Sie, dass ich die Methode notifyDataSetChanged() verwendet habe. Ich werde wirklich dankbar sein.

Antwort

1

Beachten Sie, dass i notifyDataSetChanged() -Methode verwendet

In Ihrem Fall, das ist nutzlos. Die ArrayAdapter wird weiterhin Ihre alten String[1] verwenden. Es weiß nichts über Ihre neue String[].

Erstens, machen Sie keine Festplatten-I/O auf dem Hauptanwendungs-Thread, wie Sie hier tun. Verwenden Sie eine Art von Hintergrundoperation, z. B. AsyncTask.

Zweitens, lesen Sie die Daten nicht zweimal, da dies für den Benutzer doppelt so langsam ist. Beispielsweise könnten Sie eine Datenstruktur wie ArrayList<String> verwenden, die ihre Größe im laufenden Betrieb erweitern kann.

Dann erstellen Sie die ArrayAdapter erst, nachdem Sie die Zeichenfolgen geladen haben.

Verwandte Themen