2

这是我第一次在列表视图中处理日期。通过查看 SO 和 google,有很多关于列表视图和绑定日期的资源和示例。许多示例仅涉及日期字段,但暗示如何将它们添加到其他字段中。我要么不明白如何实现这些,要么每个人都很难,或者两者兼而有之。因此,以这种方式,我正在考虑从我在概念上所做的事情开始,然后找出我的逻辑错误或可以改进的地方,这将对其他人有所帮助。

我正在努力显示一个带有多个文本视图字段的列表视图,其中一个是格式化的日期。数据以 yyyymmdd 的形式存储在 SQLite 中,以便进行排序。(列表视图使用我的 dbadapter 中的良好查询按日期字段排序,并且工作正常)

我对列表视图的绑定日期进行了一些研究,发现我的 simplecursoradapter 无法自行工作,但我需要一个额外的 CursorAdapter 或 ViewBinder。基于此示例,我从 ViewBinder 开始,但我的字段中没有填充任何内容。需要明确的是,我所做的只是为其他领域保留了我的简单光标适配器,并且它们运行正常。然后我添加了一个连接到活页夹的附加适配器。

这是列表视图所在的活动的代码:

private void fillTasks() {
    Cursor tasksCursor = mDbHelper.fetchAllTasksforBatch(mRowId);
    startManagingCursor(tasksCursor);
    // Create an array to specify the fields we want to display in the list
    String[] from = new String[]{
                            VDbAdapter.COLUMN_taskid,
                            VDbAdapter.COLUMN_tasktype,
                            VDbAdapter.COLUMN_taskSpecGrav,
                            VDbAdapter.COLUMN_taskacid
                            //VDbAdapter.COLUMN_taskdate
                            };
    // and an array of the fields we want to bind those fields to
    int[] to = new int[]{           R.id.TASKID,
                            R.id.TASKTYPE,
                            R.id.TASKGRAVITY,
                            R.id.TASKACID
                            //R.id.DATE
                            };
    // Now create a simple cursor adapter and set it to display
    SimpleCursorAdapter tasks = new SimpleCursorAdapter(this, R.layout.tasklist_layout, tasksCursor, from, to);
    setListAdapter(tasks);
    String[] fromdate = new String[]{
        VDbAdapter.COLUMN_taskdate
    };
    // and an array of the fields we want to bind those fields to
    int[] todate = new int[]{
        R.id.DATE
    };
    //  SimpleCursorAdapter tasksdates =  new SimpleCursorAdapter(this, R.layout.tasklist_layout, tasksCursor, fromdate, todate);
    final DateViewBinder binder = new DateViewBinder(formatforddisplay, R.id.DATE);
    tasks.setViewBinder(binder);
}

这是来自 DateViewBinder 的代码,与上面的示例链接基本相同(包名当然是正确的)。

import java.text.SimpleDateFormat;
import java.util.Date;

import android.database.Cursor;
import android.view.View;
import android.widget.SimpleCursorAdapter.ViewBinder;
import android.widget.TextView;

public class DateViewBinder implements ViewBinder {
private SimpleDateFormat mFormat;
private int mTargetViewId;

public DateViewBinder(SimpleDateFormat formatforddisplay, int targetViewId) {
    mFormat = formatforddisplay;
    mTargetViewId = targetViewId;
}

public void setBinding(int from) {
    mTargetViewId = from;
}

public void setFormat(SimpleDateFormat format) {
    mFormat = format;
}

@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
    final int id = view.getId();
    if (id == mTargetViewId) {
        final String value = getLongFieldAsString(cursor, columnIndex);
        if (view instanceof TextView)
            setViewText((TextView)view, value);
        else
            throw new IllegalStateException(view.getClass().getName() + " is not a view that can be bound by this view binder (" +
                    DateViewBinder.class.getSimpleName() + ")");
        return true;
    }

    return false;
}

我在 logcat 中没有收到任何错误,所以通常这可以帮助我指出正确的方向。感谢任何帮助,我的问题以及我的陈述方式(第一次海报)

4

1 回答 1

0

这是通过将光标作为参数传递给 DateViewBinder 来解决的。这是更改的代码:

填充任务更改

 SimpleCursorAdapter tasks = 
             new SimpleCursorAdapter(this, R.layout.tasklist_layout, tasksCursor, from, to);

         final DateViewBinder binder = new DateViewBinder(formatforddisplay, R.id.DATE, tasksCursor);
         tasks.setViewBinder(binder);
         setListAdapter(tasks);

DateViewBinder 更改

  public DateViewBinder(SimpleDateFormat formatfromBatchOverview, int targetViewId, Cursor taskscursor) {
         mFormat = formatfromBatchOverview;
         mTargetViewId = targetViewId;
         cursor = taskscursor;
}
于 2013-08-17T20:55:53.663 回答