我有一个
这里,在这个适配器类中,我从SQLite数据库中获取行并填充列表。
现在,在每个列表项中都有一个时间,指定创建时间轴Feed的时间,即2小时前或10小时前等。
如何使用TimelineViewActivity类中的Handler和postDelay()函数不断更新TextView的时间,这样我就不必一直刷新每个项目,就像在Facebook应用程序中一样 - 时间线帖子。 / p>
答案 0 :(得分:1)
您不应该使用Handler
。将CursorAdapter
与db集合一起使用时,最好的做法是实现LoaderCallbacks<Cursor>
,它将为您提供每次数据库更改的回调。
您需要按照以下onCreate
方法启动回调:getLoaderManager().initLoader(0, null, this);
现在有趣的部分:
在实施LoaderCallbacks<Cursor>
时,您将被迫覆盖三种方法:
第一个方法将被调用一次并创建加载器。在创建加载器时,您指定要在每个数据库上接收的列更改:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader loader = new CursorLoader(getActivity(), DataProvider.CONTENT_URI_MESSAGES, new String[] {
DataProvider.COL_ID, DataProvider.COL_NAME, DataProvider.COL_DATE }, null, null, DataProvider.COL_DATE
+ " DESC");
return loader;
}
第二个方法将在创建加载器时调用,并在加载器表上的每个数据库更改时调用(我认为这是您要查找的内容):
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
Log.i("");
adapter.swapCursor(data);
}
当加载器自行停止时,将调用最后一个方法:
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
访问http://developer.android.com/guide/components/loaders.html了解详情。
编辑: 尝试使用适配器中的代码:
@Override
public void setViewText(TextView textView, String text) {
if(textView.getId() == R.id.tv_time_past) {
long creation_date = 0;
if (text.matches("[0-9]+") && text.length() > 2)
creation_date = Long.parseLong();
if(creation_date > 0)
new DateSetter(textView, creation_date );
}
}
DateSetter线程的代码:
private class DateSetter extends Thread{
private TextView textView;
private long creation_date;
public DateSetter(TextView textView, long creation_date){
this.textView = textView;
this.creation_date = creation_date;
}
@Override
public synchronized void run() {
while (mRunning) {
String datePast = getTimePastAsString(System.currentTimeMillis(), creation_date);
Long.parseLong()
textView.setText(datePast);
try {
Thread.sleep(1000);// update every 1 seconds
} catch(Exception e){};
}
}
}