真是个问题! 更清楚地描述它: 我正在使用片段,我的目标是使用TextView显示数据库表列的总和。每当表以不同方式更新(删除,插入,更新)时,应更新此总和。 如果没有contentprovider,我会在DBHelper类中编写一个返回值的方法。但问题开始了。片段中以编程方式更新textview非常困难(直到不可能)。因此,我喜欢使用contentprovider,因为它总是会告诉我的列表视图有关更改,而无需我的任何额外工作。在这种情况下(contentprovider)我有(imho)使用带有cursorloader和uri的loader方法onCreateLoader()和onLoadFinished()。但是他们都返回了一个游标对象,这就是我在这个单一的textview上无法附加的东西。 在浏览列表视图和内容提供者的所有日子之后,我的想法可能过于“过分夸张”,因此我无法看到简单的文本视图的简单解决方案。如果有...
答案 0 :(得分:4)
我找到了一个,至少是解决方法。如果有人知道更好的解决方案,我将不胜感激。
要使用Loader,您必须覆盖3种方法:
因此,假设我们有一个TextView电视,应该通过ContentProvider进行更新。
onCreateLoader():@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
String select = "where _id="+id; //id is definied earlier in this program
loader = new CursorLoader(getActivity(),
MaterialContentProvider.READ_SINGLE_MATSTAMM_URI, null, select, null, null);
}
return loader;
}
MaterialContentProvider.READ_SINGLE_MATSTAMM_URI是我的URI,它显示要使用的ContentProvider数据库表以及方式。在这种情况下,我会得到一个结果。 我们将通过 onLoadFinished()进行异步处理,这是我的解决方法:
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
final TextView tv = (TextView) View.findViewById(R.id.mytextview);
tv.setText(cursor.getString(cursor.getColumnIndex("myColumn")));
}
从现在开始,每当内容在onCreateLoader()中的uri所针对的表中发生更改时,您的TextView电视都会更新。 “技巧”是不像往常那样放弃光标(使用类似“adapter.swap(cursor)”的东西),因为没有任何适配器。为了得到一列的总和,你必须用光标获得这个特殊列的所有行(这意味着你有一个不同的uri)。
答案 1 :(得分:0)
我使用了here所示的方法。
基本上你需要我们Handler
将字符串从Cursor
发布到用户界面。
而且你还需要前进到第一个Cursor
- 位置:
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (cursor.moveToFirst()) {
final String text = cursor.getString(cursor.getColumnIndex(""myColumn));
final TextView tv = (TextView) View.findViewById(R.id.mytextview);
handler.post(new Runnable() {
public void run() {
tv.setText(text);
}
});
}
}
不要忘记在重置Cursor
时必须清除用户界面。
@Override
public void onLoaderReset(Loader<Cursor> loader) {
final TextView tv = (TextView) View.findViewById(R.id.mytextview);
handler.post(new Runnable() {
public void run() {
tv.setText("");
}
});
}