0
我嘗試以下方法數據,試圖讓TextView的從模型更新:TextView中不會顯示已在模型(MVC)進行了更新
- TextChangeListeners - 錯誤
- 其他螺紋
- 的AsyncTask
- 新增的刷新按鈕,更新數據,我強迫點擊
情況如下:
- 標準線程運行,每秒鐘更新模型(MVC)對象,完美工作。
- 當Model對象更新時,它會通知實現「Observer」的所有類。
- 我的GolfHomeScreen擴展了Activity並實現了Observer(代碼如下)。
- GolfHomeScreen.update(Observable observable,Object data)方法完美。它按預期每秒執行一次,S.O.P執行正確的數據(請參閱 - > // *#1 *)。
- 然後這會啓動一個線程。我在這個網站上讀到,你必須使用UI Thread來執行更新小部件的代碼,然後運行「runOnUiThread」方法 - 代碼看起來像我在下面所做的,但我發現它有點難以遵循。無論如何,此線程運行(請參閱 - > // *#2 )然後執行onClick(View v)方法(請參閱 - > // #3 *)。
System.out.println("driverType :" + mvcModel.getDriverName());
(參見 - > // *#4 *)完美地工作。- // *#5 * - 它必須更新,但不是。
- 如果我實際上點擊了按鈕,數據將正確顯示在屏幕上。我唯一的猜測是屏幕不能刷新強制點擊,否則我不使用UI線程進行更新。
注意:如果下面的代碼丟失了一些東西,這是因爲我刪除了大量的代碼來簡化對正在發生的事情的理解。
public class GolfHomeScreen extends Activity implements Observer
{
GolfHomeScreen golfHomeScreen = null;
TextView driverName = null; // Type of driver used by golfer (eg: 1 wood)
Button refreshData = null;
@Override public void onClick(View v) //*** #3 ***
{
if ((v.getId()) == 12345) // ID of wood (12345 = 1 wood)
{
//*** #4 ***
System.out.println("driverType :" + mvcModel.getDriverName()); //THIS PRINTS OUT THE LATEST DATA!!!
//*** #5 ***
driverName.setText(String.valueOf(mvcModel.getDriverName())); //THIS DOESN'T AFFECT THE SCREEN?? WHY :-(
}
}
@Override public void onCreate(Bundle savedInstanceState)
{
golfHomeScreen = this;
refreshData = indViewById(R.id.golfhomescreen_button_refreshData);
driverName = (TextView) findViewById(R.id.golfhomescreen_text_drivername);
}
@Override public void update(Observable observable, Object data)
{
// #1 ***
System.out.println("driverType :" + mvcModel.getDriverName());
golfHomeScreen.runOnUiThread(new Runnable()
{
@Override
public void run()
{
refreshData.performClick(); //*** #2 ***
}
});
}
}
嗨Budius,它沒有工作。以下 – user2082983 2013-03-04 18:54:53
忽略上面的評論 - 我需要充分測試它正確,我運行在一箇舊的筆記本電腦在莫,並不能正確地測試它,但它' D看起來不會工作!當我回到我的dec機器時,我會稍後再報告一次! – user2082983 2013-03-04 19:06:34
它不工作 - 我已經改變了我的架構,因爲它變得太複雜了! 我固執己見!感謝您的迴應 – user2082983 2013-03-14 13:46:11