问题
I am trying to update the list view with timer.I have implemented the android UI timer tutorial but my problem is how to use it for List view where i need to update the each row of list after a certain interval. how does the handler will update the each row of the list(i.e suppose a textview is inside the eachrow where i'll display the updated values.)
public class 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;
}
回答1:
Create a customHandler class that extends Handler class and call the sendEmptyMessage() of handler from the timer run() method.
In the Handler class override the handleMessage and update your listview values and call adapter.notifyDataSetChanged() which will refresh the listview with the updated values.
Here is the sample code :
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
}
}
回答2:
For using a clock I could propose my own class based on Handler class.
It start/ stops the timing and shows the time and/or date in the registered TextView fields.
As for Timer class, it is thread-unsafe for use in UI threads (Activities and Widgets, for example)
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);
}
}
回答3:
well, I think of an AsyncTask
that's get executed from inside the run()
method of the timer.
来源:https://stackoverflow.com/questions/8968911/updating-the-list-ui-with-timer