2011-02-02 20 views
6

Jestem całkiem nowy w rozwoju Androida. Czy ktoś może dać mi znać odpowiednie API do dynamicznej aktualizacji TextView (lub całego ekranu)?dynamicznie aktualizuj TextView w Androidzie

Na przykład: Mam aplikację wyszukującą i muszę wyświetlać wyniki, które zostały znalezione, zamiast czekać na wszystkie wyniki, a następnie pokazać.

+0

Musisz przeprowadzić wyszukiwanie w osobnym wątku, najprawdopodobniej, jeśli nie chcesz, aby wyszukiwanie blokowało wykonywanie głównej aplikacji. Następnie zmodyfikuj okresowo aktualizację kontenera za pomocą nowych obiektów TextView. Więc możesz mieć liniowy układ, który jest pusty i okresowo wywoływać do wątku wyszukiwania, aby zobaczyć, jakie wyniki ma i dodać je do układu liniowego. – DeliveryNinja

+0

Czy Twoje pytanie pozostało bez odpowiedzi? – winklerrr

Odpowiedz

1

Jeśli masz nowy tekst, który ustawisz na TextView, po prostu zadzwoń pod numer textView.setText(newText), gdzie newText jest tekstem zaktualizowanym. Wywołaj tę metodę za każdym razem, gdy zmienił się tekst newText. Czy tego właśnie szukasz?

+0

dziękuję hmm ... to w pewnym stopniu odpowiada ... ale muszę zachować stare dane również oprócz nowo nadchodzących danych ... jak to zrobić .. powinienem użyć widoku listy ... – prash

+0

@ prash, aby śledzić stare dane, możesz użyć 'textView.getText()'. Po pierwsze: 'CharSequence old = textView.getText();', a następnie np. dołącz stare i nowe dane i ustaw je z powrotem na tekst "TextView": "textView.setText (stary +" "+ nowy);" – winklerrr

20

Jest kilka kroków i nie wspomniałeś, ile wiesz, a ile nie.

Zakładając, że UI początkowa struktura jest zdefiniowana w RES/układ i zawiera TextView gdzieś w swojej działalności:

public void updateTextView(String toThis) { 
    TextView textView = (TextView) findViewById(R.id.textView); 
    textView.setText(toThis); 
} 
+3

powrót jest zbędny, ale dziękuję! – Austin

0

Po pierwsze, trzeba widoku listy, więc

private volatile ArrayList<String>  searchResults; 
ListView searchList = (ListView) findViewById(R.id.listYOURLISTVIEW); 
listAdapter = new ArrayAdapter<String>(this, R.layout.blacklist, R.id.list_content, searchResults); //blacklist is a layout to paint the fonts black 
searchList.setAdapter(listAdapter); 

Oto coś, co może pomóc.

private Thread refreshThread; 
private boolean isRefreshing = false; 

private void reinitializeRefreshThread() 
{ 
    if (!refreshThread.equals(null)) refreshThread.stop(); 
    Log.d(LOGTAG+"::reinitializeRefreshThread()", "Creating new thread!\n"); 
    isRefreshing = true; 
    refreshThread = (new Thread(new Runnable() 
    { 
     public void run() 
     { 
      Looper.prepare(); 
      while (isRefreshing) 
      { 
       //GRAB YOUR SEARCH RESULTS HERE 
       //make sure the methods are synchronized 
       //maybe like 
       String[] results = grabResults(); //doesn't need to be synchronized 
       addResultList(results); 

       Message message = myHandler.obtainMessage(); 
       myHandler.sendMessage(message); 
       try 
       { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) 
       { 
        e.printStackTrace(); 
       } 
       Log.d(LOGTAG+"->refreshThread", "Refresh finished!\n"); 
      } 
     } 
    })); 
    Log.d(LOGTAG+"::reinitializeRefreshThread()", "Refresh thread started!\n"); 
    refreshThread.start(); 
} 

final Handler myHandler = new Handler() 
{ 
    public void handleMessage(android.os.Message msg) 
    { 
     listAdapter.notifyDataSetChanged(); 
    }; 
}; 

gdzie

public synchronized void addResultList(String[] results) 
{ 
    // remove the whole list, repopulate with new data 
    searchResults.clear(); 
    for (int i = 0; i < results.length; i++) 
    { 
     addResult(results[i]); 
    } 
} 

private synchronized void addResult(CharSequence result) 
{ 
    if (!searchResults.contains(result.toString())) 
     searchResults.add(result.toString()); 
    else 
     Toast.makeText(getApplicationContext(), "Result " + result.toString() + " was already on the list!", Toast.LENGTH_SHORT).show(); 
} 

Wszystko to jest thread-safe, co oznacza, pozwoli to na „zmiany” GUI z wątków innych niż główny wątek, wysyłając komunikat do głównego wątku, że Interfejs użytkownika wymaga aktualizacji. Jak widać, refreshThread aktualizuje kolekcję wyszukiwania (upewnij się, że metoda jest zsynchronizowana), a następnie powiadamia główny wątek (UI), aby zaktualizować listę.

Prawdopodobnie okaże się to przydatne zbyt

searchList.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
     { 
      listIndex = arg2; 
      selectedItem = (String) searchList.getItemAtPosition(listIndex); 
      Toast.makeText(getApplicationContext(), "Result[" + listIndex + "] " + selectedItem + " selected!", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

Nie może być kilka luźne końce takie jak trzeba zainicjować listIndex i selectedItem lub po prostu wyrzucić je na zewnątrz, ale w ogóle to załatwiło sprawę do mnie bardzo podobna sytuacja (mam wątek tła, który zapełnia się lista z upływem czasu nowych wpisów)

nadzieję, że to pomaga :)

0

Jeśli jesteś wewnątrz innego wątku, upewnij się zaktualizować TextView wewnątrz wątku UI .

private void updateTextView(final String s) { 
    MainActivity.this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      TextView tv= (TextView) findViewById(R.id.tv); 
      tv.setText("Text = "+s); 
     } 
    }); 

} 
Powiązane problemy