Невозможно обновить TextView PageAdapter от таймера - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть таймер в моем onCreate (), он должен установить новый текст, когда значение изменяется timeString.К сожалению, сейчас это не меняется вообще.

Вот фрагмент моего кода.Я не знаю, что я пропустил?Если у вас есть какие-либо предложения, пожалуйста, дайте мне знать.

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

}

1 Ответ

1 голос
/ 09 февраля 2012

У вас есть эта строка:

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

Я предполагаю, что у вас есть TextView txtDurationValue; в вашем адаптере, который вы не включили в исходный код вашего вопроса? Если его там нет, добавьте это внутрь адаптера. (Технически вы не должны предоставлять необработанные значения / представления из адаптера, вы должны использовать get / sets, но это должно работать, пока вы не выполните рефакторинг):

public TextView txtDurationValue;

После этого вы сможете добавить

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

Это будет означать, что вы можете изменить это //pager.getAdapter (). NotifyDataSetChanged (); чтобы:

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