我對Android開發頗爲陌生。有人可以讓我知道相關的API來動態更新TextView
(或整個屏幕)嗎?在Android中動態更新TextView
例如:我有一個搜索應用程序,我需要顯示找到的結果,而不是等待所有結果,然後顯示。
我對Android開發頗爲陌生。有人可以讓我知道相關的API來動態更新TextView
(或整個屏幕)嗎?在Android中動態更新TextView
例如:我有一個搜索應用程序,我需要顯示找到的結果,而不是等待所有結果,然後顯示。
如果您有一個新的文本設置爲TextView
,只需撥打textView.setText(newText)
,其中newText是更新的文本。每當newText發生變化時調用此方法。那是你在找什麼?
謝謝嗯......這在一定程度上回答...但我需要保持舊數據,除了新來的數據...我該怎麼做呢..我應該使用列表視圖... – prash 2011-03-21 07:27:56
有幾個步驟,你沒有提到你知道多少,你沒有多少。
假設你的UI初始結構是在res /佈局定義,它包括一個TextView的地方,在你的活動:
public void updateTextView(String toThis) {
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(toThis);
}
首先,你需要一個列表視圖,讓
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屬性或只是把他們抓出來是幾個零星這樣的,但一般這樣做有問題,我在一個非常類似的情況(我有一個後臺線程隨着時間的推移用新條目填充列表)
希望它能幫助:)
如果您是其他線程內,請確保您更新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);
}
});
}
如果您不希望搜索阻止您的主應用程序執行,您將需要在單獨的線程中完成搜索。然後讓它定期用新的TextView對象更新一個容器。所以你可以有一個空的線性佈局,並定期調用搜索線程來查看它的結果,並將它們添加到線性佈局中。 – DeliveryNinja 2011-02-02 10:41:19
您的問題仍未解答? – winklerrr 2016-12-21 22:21:47