Android:使用CursorAdapter从列表视图中删除项目
我创建了一个片段,其中包含一个项目列表,其中包含从SQLite数据库加载的信息。我使用CursurAdapter加载数据。下面是扩展CursorAdapter的片段和内部AlarmAdapter类Android:使用CursorAdapter从列表视图中删除项目,android,sqlite,android-cursoradapter,android-cursor,Android,Sqlite,Android Cursoradapter,Android Cursor,我创建了一个片段,其中包含一个项目列表,其中包含从SQLite数据库加载的信息。我使用CursurAdapter加载数据。下面是扩展CursorAdapter的片段和内部AlarmAdapter类 public class AlarmListFragment extends Fragment { private DBHelper dbHelper; private Context context; private Cursor mCursor; private
public class AlarmListFragment extends Fragment {
private DBHelper dbHelper;
private Context context;
private Cursor mCursor;
private AlarmListAdapter alarmItemAdapter;
private final String QUERY = String.format("SELECT * FROM %s", DBHelper.TABLE_ALARM_LIST);
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = getActivity().getApplicationContext();
dbHelper = new DBHelper(context);
SQLiteDatabase db = dbHelper.getReadableDatabase();
mCursor = db.rawQuery(QUERY, null);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
/*
* Instead of doing inflater.inflate(R.layout.fragment_alarm_list, null);
* inflater.inflate(R.layout.fragment_alarm_list, container, false) will occur with the given container, but won't attach it to the parent.
*/
View view = inflater.inflate(R.layout.fragment_alarm_list, container, false);
final ListView lvAlarmsList = (ListView) view.findViewById(R.id.lvAlarmsList);
alarmItemAdapter = new AlarmListAdapter(context, mCursor, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
lvAlarmsList.setAdapter(alarmItemAdapter);
loadAlarms();
Button btnAddNewAlarm = (Button) view.findViewById(R.id.btnAddNewAlarm);
btnAddNewAlarm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlarmPreferencesFragment fragment = new AlarmPreferencesFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right);
transaction.replace(R.id.main_frame, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
return view;
}
private void loadAlarms() {
int alarmsCount = dbHelper.getAllAlarms().size();
if(alarmsCount != 0) {
for (int i = 1; i <= alarmsCount; i++) {
Alarm alarm = dbHelper.getAlarm(i);
alarmItemAdapter.addItem(alarm);
}
}
alarmItemAdapter.notifyDataSetChanged();
}
class AlarmListAdapter extends CursorAdapter {
private ArrayList<Alarm> itemsList = new ArrayList<>();
AlarmListAdapter(Context context, Cursor cursor, int flags) {
super(context, cursor, flags);
}
@Override
public int getCount() {
return itemsList.size();
}
@Override
public Object getItem(int i) {
return itemsList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return inflater.inflate(R.layout.listitem_alarm, parent, false);
}
@Override
protected void onContentChanged() {
super.onContentChanged();
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
final long id = cursor.getLong(0);
final int position = cursor.getPosition();
final Alarm alarm = dbHelper.getAlarm(id);
CardView cvAlarmItem = (CardView) view.findViewById(R.id.cvAlarmItem);
cvAlarmItem.setBackgroundColor(ContextCompat.getColor(context, R.color.super_light_grey));
cvAlarmItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// If you click the CardView item, it will lead to the alarm preference fragment with the corresponding alarm's info.
Bundle bundle = new Bundle();
bundle.putSerializable("alarm", alarm);
Toast.makeText(getContext(), ""+id, Toast.LENGTH_SHORT).show();
AlarmPreferencesFragment fragment = new AlarmPreferencesFragment();
fragment.setArguments(bundle);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.main_frame, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
TextView tvSetAlarmType = (TextView) view.findViewById(R.id.tvSetAlarmType);
int alarmType = alarm.getRingTypeOptionNum();
String strAlarmType = "";
switch(alarmType) {
case SoundVibrate.SOUND:
strAlarmType = getString(R.string.sound);
break;
case SoundVibrate.SOUND_AND_VIBRATE:
strAlarmType = getString(R.string.sound_and_vibrate);
break;
case SoundVibrate.VIBRATE:
strAlarmType = getString(R.string.vibrate);
break;
}
tvSetAlarmType.setTextColor(ContextCompat.getColor(context, R.color.dark_grey));
tvSetAlarmType.setText(strAlarmType);
TextView tvSetAlarmRepeat = (TextView) view.findViewById(R.id.tvSetAlarmRepeat);
tvSetAlarmRepeat.setTextColor(ContextCompat.getColor(context, R.color.dark_grey));
Alarm.Day[] repeatDays = alarm.getRepeatDays();
String guide = "";
int size = repeatDays.length;
if(size > 1) {
int i = 0;
while(i<size-1) {
guide += repeatDays[i].toString() + ", ";
++i;
}
guide += "and " + repeatDays[size-1];
} else if(size == 1){
guide = repeatDays[0].toString();
} else {
guide = getString(R.string.never);
}
tvSetAlarmRepeat.setText(guide);
TextView tvSetAlarmTime = (TextView) view.findViewById(R.id.tvSetAlarmTime);
String strAlarmTime = alarm.getAlarmTimeString();
tvSetAlarmTime.setTextColor(ContextCompat.getColor(context, R.color.dark_grey));
tvSetAlarmTime.setText(strAlarmTime);
Switch switchAlarmOnOff = (Switch) view.findViewById(R.id.switchAlarmOnOff);
boolean active = alarm.isAlarmActive();
switchAlarmOnOff.setChecked(active);
switchAlarmOnOff.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
}
});
ImageView ivDelete = (ImageView) view.findViewById(R.id.ivDelete);
ivDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Cursor c = alarmItemAdapter.getCursor();
c.moveToPosition(position);
dbHelper.deleteAlarm(alarm);
loadAlarms();
}
});
}
void addItem(Alarm item) {
itemsList.add(item);
}
}
}
我认为这个问题与
光标有关,但我不知道如何开始 检查上述行的条件:
if(alarm!=null && alarm.isAlarmActive()!=null && alarm.isAlarmActive()){
boolean active = alarm.isAlarmActive();
switchAlarmOnOff.setChecked(active);
}
我希望这段代码能对您有所帮助。此错误发生在以下哪一行boolean active=alarm.isAlarmActive()bindView()
方法中的code>导致了错误。但是您刚刚删除了报警,所以它是空的。那么我应该移动光标吗?如果是,怎么做?可能的副本
if(alarm!=null && alarm.isAlarmActive()!=null && alarm.isAlarmActive()){
boolean active = alarm.isAlarmActive();
switchAlarmOnOff.setChecked(active);
}