2011-02-02 126 views
6

我對Android開發頗爲陌生。有人可以讓我知道相關的API來動態更新TextView(或整個屏幕)嗎?在Android中動態更新TextView

例如:我有一個搜索應用程序,我需要顯示找到的結果,而不是等待所有結果,然後顯示。

+0

如果您不希望搜索阻止您的主應用程序執行,您將需要在單獨的線程中完成搜索。然後讓它定期用新的TextView對象更新一個容器。所以你可以有一個空的線性佈局,並定期調用搜索線程來查看它的結果,並將它們添加到線性佈局中。 – DeliveryNinja 2011-02-02 10:41:19

+0

您的問題仍未解答? – winklerrr 2016-12-21 22:21:47

回答

1

如果您有一個新的文本設置爲TextView,只需撥打textView.setText(newText),其中newText是更新的文本。每當newText發生變化時調用此方法。那是你在找什麼?

+0

謝謝嗯......這在一定程度上回答...但我需要保持舊數據,除了新來的數據...我該怎麼做呢..我應該使用列表視圖... – prash 2011-03-21 07:27:56

20

有幾個步驟,你沒有提到你知道多少,你沒有多少。

假設你的UI初始結構是在res /佈局定義,它包括一個TextView的地方,在你的活動:

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

首先,你需要一個列表視圖,讓

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

這可能有些幫助。

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

其中

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

所有這一切是線程安全的,這意味着它可以讓你「變」 GUI從非主線程其他線程通過發送消息到主線程的UI需要更新。如您所見,refreshThread更新搜索集合(確保該方法已同步),並稍後通知主(UI)線程更新列表。

你可能會覺得這太有用

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

有可能因爲你需要初始化列表索引和selectedItem屬性或只是把他們抓出來是幾個零星這樣的,但一般這樣做有問題,我在一個非常類似的情況(我有一個後臺線程隨着時間的推移用新條目填充列表)

希望它能幫助:)

0

如果您是其他線程內,請確保您更新UI線程內的TextView 。

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

}