2012-02-09 10 views
0

私はonCreate()にTimerを持っていますが、timeStringが変更されたときに新しいテキストを設定する必要があります。残念ながら今はまったく変わりません。PageAdapterのTextViewをタイマーから更新できません

ここに私のコードのスニペットがあります。私は何を逃したのか分からない?皆さんにご提案がありましたら、お知らせください。

ViewPagerActivity

public class ViewPagerActivity extends MapActivity { 
    private ViewPagerAdapter adapter; 
    private ViewPager pager; 
    private String timeString; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     adapter = new ViewPagerAdapter(this); 
     pager = (ViewPager) findViewById(R.id.viewpager); 
     TitlePageIndicator indicator = (TitlePageIndicator) findViewById(R.id.indicator); 
     pager.setAdapter(adapter); 
     indicator.setViewPager(pager); 

     Timer myTimer = new Timer(); 
     myTimer.schedule(new TimerTask() { 
       public void run() { 
        timerMethod(); 
       } 
      }, 0, 1000); 
    } 

    private void timerMethod() { 
     this.runOnUiThread(doTimer); 
    } 

    private Runnable doTimer = new Runnable() { 
      private int totalSecs; 
      private int hours; 
      private int minutes; 
      private int seconds; 

      public void run() { 

       totalSecs += 1; 
       hours = totalSecs/3600; 
       minutes = (totalSecs % 3600)/60; 
       seconds = totalSecs % 60; 

       timeString = (String) (hours > 9 ? String.valueOf(hours): AddZero(hours)) + ":" + 
        (String) (minutes > 9 ? String.valueOf(minutes): AddZero(minutes)) + ":" 
        + (String) (seconds > 9 ? String.valueOf(seconds): AddZero(seconds)); 

       //pager.getAdapter().notifyDataSetChanged(); 

      } 

      private String AddZero(int text) { 
       return "0"+ text; 
      } 
     }; 
} 

ViewPagerAdapter

public class ViewPagerAdapter extends PagerAdapter implements TitleProvider { 
    private final Context context; 
    private MapView mapView; 
    private MapController mapController; 
    private View view; 

    public ViewPagerAdapter(Context context) { 
      this.context = context; 
    } 

    private static String[] titles = new String[] { "Page1", "Map" }; 

    @Override 
    public Object instantiateItem(View pager, final int position) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (position == 0) { 
      view = inflater.inflate(R.layout.whereami, null); 
      ((ViewPager) pager).addView(view, 0); 
     //here, set text at first time when view was create only 
     //and not update,when value of timeString change 
     txtDurationValue = (TextView)view.findViewById(R.id.txtDurationValue); 
     txtDurationValue.setText(timeString); 

     } 
     if (position == 1) { 
      view = inflater.inflate(R.layout.my_map_activity, null); 
      ((ViewPager) pager).addView(view, 0); 
      mapView = (MapView) view.findViewById(R.id.mapview); 

      mapController = mapView.getController(); 
      mapController.setZoom(14); 
     } 

     return view; 
    } 

public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

} 
+0

'TimeRunning'はどのように設定されていますか? –

+0

実際に開始するには1です。停止するには2です。停止するには2です。それは旗のように(私はこの例のためにそれをカットする)残念 –

答えて

1

あなたはこのラインがあります。

txtDurationValue = (TextView)view.findViewById(R.id.txtDurationValue); 

を私はあなたがTextView txtDurationValue;を持っていると仮定しています質問ソースコードに含まれていないアダプタ?そこにない場合は、アダプタの内側にこれを追加します。 (あなたは、アダプタからの生の値/ビューを公開してはならない技術的には、あなたが得る/セットを使用する必要がありますが、あなたがリファクタリングするまで、これは動作するはずです):

public TextView txtDurationValue; 

あなたはその後、

public void setText(String text) { 
    txtDurationValue.setText(text); 
} 

を追加することができるはずですこれは//pager.getAdapter()を変更できることを意味します。notifyDataSetChanged(); To:

((ViewPagerAdapter)pager.getAdapter()).setText(text); 

何それは行いませんすることは、要素がインスタンス化される前に解雇されたのonCreateでタイマーを()オフに設定しているという事実の世話をします。

これは私の好きなAndroidハックです(indicatorや他のビューを参照することができます)。ビューが表示された直後にコードが実行されます。

ViewTreeObserver vto = indicator .getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      view.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        myTimer.schedule(new TimerTask() { 
         public void run() { 
          timerMethod(); 
         } 
        }, 0, 1000); 
    }); 
関連する問題