Обновление пользовательского интерфейса списка с помощью таймера - PullRequest
1 голос
/ 23 января 2012

Я пытаюсь обновить представление списка с помощью timer.Я реализовал учебник по таймеру пользовательского интерфейса Android, но моя проблема заключается в том, как использовать его для представления списка, где мне нужно обновить каждую строку списка после определенного интервала.как обработчик обновит каждую строку списка (то есть предположим, что текстовое представление находится внутри каждой строки, где я буду отображать обновленные значения.)

открытый класс ListAdapter extends BaseAdapter {

private List<String> messages;
private Context mContext;

public ListAdapter(Context context , List<String> messages){
    this.messages   =  messages;
    mContext   =  context;
}

@Override
public int getCount(){
    return messages.size();
}

@Override
public Object getItem(int location){
    return messages.get(location);
}

@Override
public long getItemId(int index){
    return index;
}

@Override
public View getView(int index , View convertView, ViewGroup viewGroup){

        TextView time = new TextView(mContext);

            //udpate the time.setText() using timer
    convertView = (View)time

    return convertView;
}   

Ответы [ 3 ]

3 голосов
/ 23 января 2012

Создайте класс customHandler, расширяющий класс Handler, и вызовите обработчик sendEmptyMessage () из метода timer run ().

В классе Handler переопределите handleMessage и обновите значения списка и вызовите adaptor.notifyDataSetChanged (), который обновит представление списка с обновленными значениями.

Вот пример кода:

Timer timer = new Timer();
CustomTimerTask customTimerTask = new CustomTimerTask();
customTimerTask.run();
timer.scheduleAtFixedRate(customTimerTask, 1000 , 1000);

class CustomTimerTask extends TimerTask {

    @Override
    public void run() {
        myHandler.sendEmptyMessage(0);
    }
}

    class CustomHandler extends Handler{


    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        /// Do your listview update thing
 }

}

1 голос
/ 31 января 2012

Для использования часов я мог бы предложить свой собственный класс, основанный на классе Handler. Он запускает / останавливает время и показывает время и / или дату в зарегистрированных полях TextView.
Что касается класса Timer, то он небезопасен для использования в потоках пользовательского интерфейса (например, Activity и Widgets)

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import android.os.Handler;
import android.widget.TextView;
/**
 * The class for creating and refreshing many different fields on different layouts,
 * that can hold actual time and/or date in different formats 
 * The formats should be as in http://developer.android.com/reference/java/text/SimpleDateFormat.html. 
 * Only present and visible fields are being actualized, so there is no need to clean the clock list after closing an activity
 * 
 * Examples of use:
 * 
 *      Clock.registerClock((TextView) findViewById(R.id.TimeField), "HH:mm");
 *      Clock.registerClock((TextView) findViewById(R.id.DateField), "d.M.yyyy EEE");
 *      Clock.start(10000L);
 *
 * @author Petr Gangnus
 */
public final class Clock {
    /**
     * the handler that works instead of timer and supports UI
     */
    static private Handler handler = new Handler();
    /**
     * the interval of the time refreshing
     */
    static private long refreshStep;

    /**
     * pairs TextView timer+time/date format
     */
    private TextView clockFace;
    private String format;
    private Clock(TextView clockFace, String format){
        this.clockFace=clockFace;
        this.format=format;
    }
    // here is the list of views containing the visual timers that should be held actual
    static private ArrayList<Clock> clocks=new ArrayList<Clock>();
    /**
     * fills all timer fields by actual time value, according to their formats.
     */
    static private Runnable mUpdateTimeTask = new Runnable() {
       public void run() {
           for(Clock clock:clocks){
               showActualTimeDate(clock);
           }
           handler.postDelayed(this,refreshStep);
       }
    };

    //============================================ public members ====================================================================
    /**
     * add a clock to the list of updating clocks
     * @param clockFace - the place where the time or date will be shown 
     * @param format - the format of the time/date 
     * @return
     */
    public static boolean registerClock(TextView clockFace, String format){
        if (clockFace==null) return false;
        if(clocks.contains(clockFace)){
            // old clockFace
            clocks.get(clocks.indexOf(clockFace)).format=format;
        } else {
            // new clockFace
            clocks.add(new Clock(clockFace, format));
        }
        return true;
    }
    /**
     * remove a clock from the updating list
     * @param clockFace
     * @return
     */
    public static boolean unRegisterClock(TextView clockFace){
        if (clockFace==null) return false;
        if(clocks.contains(clockFace)){
            // found clockFace
            clocks.remove(clocks.indexOf(clockFace));
        } else {
            // not found clockFace
            return false;
        }
        return true;
    }
    /**
     * put in the "place" the actual date/time in the appropriate "format"
     * @param place
     * @param format
     */
    public static void showActualTimeDate(Clock clock){
        if (clock.clockFace==null) return;
        if (clock.clockFace.getVisibility()!=TextView.VISIBLE) return;
        Date thisDate=new Date();
        SimpleDateFormat df=new SimpleDateFormat(clock.format);
        clock.clockFace.setText(df.format(thisDate));
    }
    /**
     * start the ticking for all clocks
     * @param step the tick interval
     */
    public static void start(long step) { 
        refreshStep=step;
        handler.removeCallbacks(mUpdateTimeTask);
        handler.postDelayed(mUpdateTimeTask, 0);
    }
    /**
     * Stopping ticking all clocks (not removing them)
     * the calling could be put somewhere in onStop
     */
    public static void stop() { 
        handler.removeCallbacks(mUpdateTimeTask);
    }
}
0 голосов
/ 23 января 2012

ну, я думаю о AsyncTask, который выполняется изнутри run() метода таймера.

...