我正在编写一个小型消息应用程序,最近遇到了这个问题。
我有一个ListFragment子类,它实现了CursorLoader回调。内置的ListView绑定到SimpleCursorAdapter。此列表中的每个行视图都有级别可绘制的背景。根据数据库信息(消息是否已发送),我想在级别之间切换。
我的问题是如何更改单个行的背景?我必须通过适配器访问它吗?我非常确定应该在onLoadFinished方法中完成此操作。但是,这段代码给我NullPointerException。如果您能指点我正确的方向,我将不胜感激。
我有一个ListFragment子类,它实现了CursorLoader回调。内置的ListView绑定到SimpleCursorAdapter。此列表中的每个行视图都有级别可绘制的背景。根据数据库信息(消息是否已发送),我想在级别之间切换。
我的问题是如何更改单个行的背景?我必须通过适配器访问它吗?我非常确定应该在onLoadFinished方法中完成此操作。但是,这段代码给我NullPointerException。如果您能指点我正确的方向,我将不胜感激。
public class MessagesFragment extends ListFragment implements
LoaderManager.LoaderCallbacks<Cursor>{
private static MessagesFragment fragment;
private static MainActivity activity;
private static SimpleCursorAdapter adapter;
public static MessagesFragment getInstance() {
if (fragment == null)
fragment = new MessagesFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activity = (MainActivity) getActivity();
adapter = new SimpleCursorAdapter(activity, R.layout.list_item, null,
new String[] {DataProvider.KEY_NUMBER, DataProvider.KEY_MESSAGE, DataProvider.KEY_TIME},
new int [] {R.id.item_field_number, R.id.item_field_message, R.id.item_field_time}, 0);
setListAdapter(adapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_messages, null);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
activity.showDetails(Long.valueOf(id).intValue());
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(activity, DataProvider.CONTENT_URI, null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
while (data.moveToNext()) {
int id = data.getInt(data.getColumnIndex(DataProvider.KEY_ID));
int sent = data.getInt(data.getColumnIndex(DataProvider.KEY_SENT));
this.getListView().getChildAt(id).getBackground().setLevel(sent);
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
}
this.getListView().getChildAt(id).getBackground().setLevel(sent);
这些值不是空的。我已经检查过了。 - Nikolaiid
和sent
不为null,则在while循环执行期间,其中一个函数返回了null。我认为是getChildAt(id)
的问题。 - RoraΖ