不断更新自定义游标适配器中的textview

时间:2015-02-04 07:49:43

标签: android simplecursoradapter android-cursoradapter timeline

我有一个

  1. TimelineViewActivity类,包含listView
  2. TimelineFeedsCursorAdapter类,扩展了CursorAdapter
  3. 这里,在这个适配器类中,我从SQLite数据库中获取行并填充列表。

    现在,在每个列表项中都有一个时间,指定创建时间轴Feed的时间,即2小时前或10小时前等。

    如何使用TimelineViewActivity类中的Handler和postDelay()函数不断更新TextView的时间,这样我就不必一直刷新每个项目,就像在Facebook应用程序中一样 - 时间线帖子。 / p>

1 个答案:

答案 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){};
        }
    }
}