我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)
);
此外,我已经读过从光标填充列表应该通过使用加载器来完成(特别是在使用数据库时,因为它可能是一个非常慢的操作)。
我找到了SimpleCursorLoader
类here on stackoverflow,但它直接将数据映射到字段。
这不是我想要的,因为正如你所看到的,在我的objective
表中我有一个activity_code
。所以我想用一个字符串替换它(我有一个Enum,它列出了我的所有活动代码,并为每个活动代码返回一个字符串资源标识符)。
您知道在TextView
s?
这是我的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&gt;中关闭光标和数据库。 loadInBackground,对吧?否则无法读取数据。关闭操作是自动处理还是我需要在其他地方自己处理?
答案 0 :(得分: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个索引(set中的第5列),因此只使用setViewBinder()来操作所需的列。
此外,我的布局有5个文本视图,用于显示光标中的5个字段。这里还有一点值得注意的是,当使用“if”条件来捕获列索引时,请确保每个条件块必须包含“return true”。在这种情况下,解释器达到“返回假” - 意味着你的领域没有被操纵。
我确信上面的代码块非常简单易懂。