在自定义游标适配器中不断更新 textview
Contantly updating textview in a custom cursor adapter
我有一个
- TimelineViewActivity class,包含一个 listView
- TimelineFeedsCursorAdapter class,扩展了 CursorAdapter
在这里,在此适配器中 class 我正在从 SQLite 数据库中获取行并填充列表。
现在在每个列表项中都有一个时间指定时间线提要的创建时间,即 2 小时前或 10 小时前等。
如何使用 TimelineViewActivity class 中的 Handler 和 postDelay() 函数不断更新 TextView 的时间,这样我就不必一直刷新每个项目,就像在 Facebook 应用程序中一样 -时间轴帖子。
你不应该使用 Handler
。将 CursorAdapter
与数据库集成一起使用时,最好的办法是实现 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;
}
第二个方法将在加载程序创建时以及加载程序上的每个数据库更改时调用 table(我想这就是您要找的):
@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){};
}
}
}
我有一个
- TimelineViewActivity class,包含一个 listView
- TimelineFeedsCursorAdapter class,扩展了 CursorAdapter
在这里,在此适配器中 class 我正在从 SQLite 数据库中获取行并填充列表。
现在在每个列表项中都有一个时间指定时间线提要的创建时间,即 2 小时前或 10 小时前等。
如何使用 TimelineViewActivity class 中的 Handler 和 postDelay() 函数不断更新 TextView 的时间,这样我就不必一直刷新每个项目,就像在 Facebook 应用程序中一样 -时间轴帖子。
你不应该使用 Handler
。将 CursorAdapter
与数据库集成一起使用时,最好的办法是实现 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;
}
第二个方法将在加载程序创建时以及加载程序上的每个数据库更改时调用 table(我想这就是您要找的):
@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){};
}
}
}