Android:使用CursorAdapter从列表视图中删除项目

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

我创建了一个片段,其中包含一个项目列表,其中包含从SQLite数据库加载的信息。我使用CursurAdapter加载数据。下面是扩展CursorAdapter的片段和内部AlarmAdapter类

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