4

my 的每一项都SherlockListFragment包含 3 个TextView:一个名字和两个数字。数据来自objective我的数据库表,其结构如下:

CREATE TABLE objective (
    _id INTEGER PRIMARY KEY,
    id_project INTEGER NOT NULL,
    activity_code INTEGER NOT NULL,
    day_duration INTEGER NOT NULL,
    week_frequency INTEGER NOT NULL,
    FOREIGN KEY(id_project) REFERENCES project(id_project)
);

此外,我已经读过应该通过使用加载器来从游标填充列表(特别是在使用数据库时,因为它可能是一个非常慢的操作)。我在 stackoverflow 上SimpleCursorLoader找到了一个类,但它直接将数据映射到一个字段。

这不是我真正想要的,因为如您所见,在我的objective桌子上我有一个activity_code. 所以我想用一个字符串替换它(我有一个枚举,它列出了我所有的活动代码,并为每个活动代码返回一个字符串资源标识符)。

你知道我如何在数据显示在TextViews 之前对其进行操作吗?

这是我的SherlockListFragment

public class ObjectivesDisplayFragment extends SherlockListFragment implements LoaderManager.LoaderCallbacks<Cursor>
{
    private Activity activity;
    private SimpleCursorAdapter adapter;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    {
        return inflater.inflate(R.layout.objectives_display, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        activity = getActivity();

        String[] columns = new String[] { "activity_code", "day_duration", "week_frequency" };
        int[] to = new int[] { R.id.activityName, R.id.objectiveDuration, R.id.objectiveFrequency };

        getLoaderManager().initLoader(0x01, null, this);

        adapter = new SimpleCursorAdapter(activity.getApplicationContext(), R.layout.objective_row, null, columns, to, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        setListAdapter(adapter);
    }

    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
        return new SimpleCursorLoader(activity) {
            @Override
            public Cursor loadInBackground() {
                DatabaseHelper dbHelper = DatabaseHelper.getInstance(activity);

                String query = "SELECT _id, activity_code, day_duration, week_frequency FROM objective WHERE id_project = ?";
                String[] args = new String[] { "1" }; // projectId
                Cursor results = dbHelper.getReadableDatabase().rawQuery(query, args);

                return results;
            }
        };
    }

    public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
        adapter.swapCursor(cursor);
    }

    public void onLoaderReset(Loader<Cursor> arg0) {
        adapter.swapCursor(null);
    }
}

编辑:我不需要在 SimpleCursorLoader > loadInBackground 中关闭游标和数据库,对吗?否则无法读取数据。那么关闭操作是自动处理的还是我需要在其他地方自己做呢?

4

1 回答 1

3

我想这可能对你有用:

adapter.setViewBinder(new ViewBinder(){
        @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            String label = "Inactive";

            if(columnIndex == 4) {
                if(cursor.getInt(columnIndex) == 1) {
                    label = "Active";
                }

                TextView tv = (TextView) view.findViewById(R.id.status);
                tv.setText(label);

                return true;
            }

            return false;
        }
    });

    setListAdapter(adapter);

背景信息:我在表中有一个外键列(整数),并希望在填充到列表视图时解析为它的字符串值(来自链接表)。列位于第 4 个索引(集合中的第 5 列),因此只需使用 setViewBinder() 来操作所需的列。

此外,我的布局有 5 个文本视图来显示光标的 5 个字段。这里还值得注意的一件事是,当使用“if”条件来捕获列索引时,请确保每个条件块都必须包含“return true”。在这种情况下,解释器达到“return false” - 意味着您的字段没有被操纵。

我确信上面的代码块非常简单易懂。

于 2012-08-31T18:39:47.510 回答