gpt4 book ai didi

android - 如何在 ListView 中显示游标数据之前对其进行操作(使用加载程序)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:42 24 4
gpt4 key购买 nike

我的 SherlockListFragment 的每一项都包含 3 个 TextView:一个名称和两个数字。数据来 self 的数据库的表 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)
);

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

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

您知道在 TextView 中显示数据之前我如何操作数据吗?

这是我的 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 中关闭游标和数据库,对吗?否则无法读取数据。那么关闭操作是自动处理还是需要我自己在别处做?

最佳答案

我想这可能对你有用:

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);

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

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

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

关于android - 如何在 ListView 中显示游标数据之前对其进行操作(使用加载程序)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12217814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com