重新启动应用程序并删除未单击的项目时,ListView开关状态会自动更改

时间:2018-12-19 04:09:10

标签: java android sqlite listview baseadapter

我正在尝试创建一个闹钟应用。 我的listView当前遇到问题。 关闭我的应用程序并再次重新启动之后,开关会以随机顺序滑动,即,如果我将第二行开关设置为关闭,则在从任务栏终止该应用程序然后再次重新启动它之后,会轻拂另一行的开关。我无法理解我的错误,请帮帮我。

Before changing Switch Status

On changing Status

After changing Switch Status

AlarmListAdapter.java

    package com.example.android.perfectclock;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

/**
 * Created by User on 02-12-2018.
 */

public class AlarmListAdapter extends BaseAdapter {
    AlarmTimePickupPopup alarmTimePickupPopup;
    private Context context;
    private ArrayList<AlarmItem> alarmItems;

    public AlarmListAdapter(ArrayList<AlarmItem> mAlarmItems, Context mContext){
        context = mContext;
        alarmItems = mAlarmItems;
    }
    @Override
    public int getCount() {
        return alarmItems.size();
    }

    @Override
    public Object getItem(int position) {
        return alarmItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        final ViewHolder viewHolder;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).
                    inflate(R.layout.alarm_list_layout, parent, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        final AlarmItem alarmItem = (AlarmItem) getItem(position);
        viewHolder.hour.setText(hour(position));
        viewHolder.minute.setText(minute(position));
        viewHolder.state.setTag(position);
        viewHolder.setting.setText(setting(position));
        Boolean state_boolean = Boolean.valueOf(state(position));
        viewHolder.state.setChecked(state_boolean);
        // initialising the switch status
        if(viewHolder.state.isChecked()){
            Calendar calender = Calendar.getInstance();
            if(millis(position)>System.currentTimeMillis()){
                AlarmManager alarmManager = (AlarmManager) parent.getContext().getSystemService(Context.ALARM_SERVICE);
                Intent intent = new Intent(parent.getContext(),AlarmReciever.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(parent.getContext(),0,intent,0);
                alarmManager.setExact(AlarmManager.RTC_WAKEUP,millis(position),pendingIntent);
            }
            else{
                Date date = new Date();
                calender.setTime(date);
                calender.add(Calendar.DATE,1);
                calender.set(Calendar.HOUR_OF_DAY,Integer.parseInt(hour(position)));
                calender.set(Calendar.MINUTE,Integer.parseInt(minute(position)));
                calender.set(Calendar.SECOND,0);
                calender.set(Calendar.MILLISECOND,0);
                AlarmManager alarmManager = (AlarmManager) parent.getContext().getSystemService(Context.ALARM_SERVICE);
                Intent intent = new Intent(parent.getContext(),AlarmReciever.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(parent.getContext(),0,intent,0);
                alarmManager.setExact(AlarmManager.RTC_WAKEUP,calender.getTimeInMillis(),pendingIntent);
            }
        }
        else{
            AlarmManager alarmManager = (AlarmManager) parent.getContext().getSystemService(Context.ALARM_SERVICE);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(parent.getContext(),0,new Intent(parent.getContext(),AlarmReciever.class),0);
            alarmManager.cancel(pendingIntent);
        }
        // onClickListener for switch status
        viewHolder.state.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position1 = (Integer) viewHolder.state.getTag();
                final AlarmItem alarmItem1 = (AlarmItem) getItem(position1);
                if(viewHolder.state.isChecked()){
                    Calendar calender = Calendar.getInstance();
                    if(millis(position1)>System.currentTimeMillis()){
                        Table table = new Table(context);
                        SQLiteDatabase sqLiteDatabase = table.getWritableDatabase();
                        ContentValues contentValues = new ContentValues();
                        contentValues.put(Field.Table.COLUMN_STATE,"true");
                        contentValues.put(Field.Table.COLUMN_PATTERN_STATUS,"false");
                        sqLiteDatabase.update(Field.Table.TABLE_NAME,contentValues,Field.Table.COLUMN_HOUR_MINUTE+"="+"'"+id(position)+"'",null);
                        sqLiteDatabase.close();
                        Toast.makeText(parent.getContext(),"Alarm Enabled",Toast.LENGTH_SHORT).show();
                        AlarmManager alarmManager = (AlarmManager) parent.getContext().getSystemService(Context.ALARM_SERVICE);
                        Intent intent = new Intent(parent.getContext(),AlarmReciever.class);
                        PendingIntent pendingIntent = PendingIntent.getBroadcast(parent.getContext(),0,intent,0);
                        alarmManager.setExact(AlarmManager.RTC_WAKEUP,millis(position),pendingIntent);
                    }
                    else{
                        Table table = new Table(context);
                        SQLiteDatabase sqLiteDatabase = table.getWritableDatabase();
                        ContentValues contentValues = new ContentValues();
                        Date date = new Date();
                        calender.setTime(date);
                        calender.add(Calendar.DATE,1);
                        calender.set(Calendar.HOUR_OF_DAY,Integer.parseInt(HH(position)));
                        calender.set(Calendar.MINUTE,Integer.parseInt(minute(position)));
                        calender.set(Calendar.SECOND,0);
                        calender.set(Calendar.MILLISECOND,0);
                        Toast.makeText(parent.getContext(),"Alarm Enabled",Toast.LENGTH_SHORT).show();
                        contentValues.put(Field.Table.COLUMN_STATE,"true");
                        contentValues.put(Field.Table.COLUMN_PATTERN_STATUS,"false");
                        sqLiteDatabase.update(Field.Table.TABLE_NAME,contentValues,Field.Table.COLUMN_HOUR_MINUTE+"="+"'"+id(position)+"'",null);
                        sqLiteDatabase.close();
                        AlarmManager alarmManager = (AlarmManager) parent.getContext().getSystemService(Context.ALARM_SERVICE);
                        Intent intent = new Intent(parent.getContext(),AlarmReciever.class);
                        PendingIntent pendingIntent = PendingIntent.getBroadcast(parent.getContext(),0,intent,0);
                        alarmManager.setExact(AlarmManager.RTC_WAKEUP,calender.getTimeInMillis(),pendingIntent);
                    }
                }
                else{
                    Table table = new Table(context);
                    SQLiteDatabase sqLiteDatabase = table.getWritableDatabase();
                    ContentValues contentValues = new ContentValues();
                    contentValues.put(Field.Table.COLUMN_STATE,"false");
                    contentValues.put(Field.Table.COLUMN_PATTERN_STATUS,"false");
                    sqLiteDatabase.update(Field.Table.TABLE_NAME,contentValues,Field.Table.COLUMN_HOUR_MINUTE+"="+"'"+id(position)+"'",null);
                    sqLiteDatabase.close();
                    Toast.makeText(parent.getContext(),"Alarm Disabled",Toast.LENGTH_SHORT).show();
                    AlarmManager alarmManager = (AlarmManager) parent.getContext().getSystemService(Context.ALARM_SERVICE);
                    PendingIntent pendingIntent = PendingIntent.getBroadcast(parent.getContext(),0,new Intent(parent.getContext(),AlarmReciever.class),0);
                    alarmManager.cancel(pendingIntent);
                }
            }
        });
        notifyDataSetChanged();
        return convertView;
    }
    @Override
    public int getViewTypeCount() {

        return 1;
    }

    @Override
    public int getItemViewType(int position) {

        return position;
    }
    private class ViewHolder {
        TextView hour;
        TextView minute;
        TextView setting;
        Switch state;

        public ViewHolder(View view) {
            hour = (TextView)view.findViewById(R.id.hour_id);
            minute = (TextView) view.findViewById(R.id.minute_id);
            setting = (TextView) view.findViewById(R.id.setting_id);
            state = (Switch) view.findViewById(R.id.switch_state);
        }
    }
    // Helper methods to get the item details from the database
    public String id(int i){
        Table table = new Table(context);
        SQLiteDatabase sqLiteDatabase = table.getReadableDatabase();
        String column[] = {Field.Table.COLUMN_HOUR_MINUTE};
        Cursor cursor = sqLiteDatabase.query(Field.Table.TABLE_NAME,column,null,null,null,null,null);
        cursor.moveToFirst();
        String id = null;
        if(cursor != null){
            cursor.moveToPosition(i);
            id = cursor.getString(cursor.getColumnIndexOrThrow(Field.Table.COLUMN_HOUR_MINUTE));
        }
        sqLiteDatabase.close();
        return id;
    }
    public String HH(int i){
        Table table = new Table(context);
        SQLiteDatabase sqLiteDatabase = table.getReadableDatabase();
        String column[] = {Field.Table.COLUMN_24HOUR};
        Cursor cursor = sqLiteDatabase.query(Field.Table.TABLE_NAME,column,null,null,null,null,null);
        cursor.moveToFirst();
        String id = null;
        if(cursor != null){
            cursor.moveToPosition(i);
            id = cursor.getString(cursor.getColumnIndexOrThrow(Field.Table.COLUMN_24HOUR));
        }
        sqLiteDatabase.close();
        return id;
    }
    public String hour(int i){
        Table table = new Table(context);
        SQLiteDatabase sqLiteDatabase = table.getReadableDatabase();
        String column[] = {Field.Table.COLUMN_HOUR};
        Cursor cursor = sqLiteDatabase.query(Field.Table.TABLE_NAME,column,null,null,null,null,null);
        cursor.moveToFirst();
        String id = null;
        if(cursor != null){
            cursor.moveToPosition(i);
            id = cursor.getString(cursor.getColumnIndexOrThrow(Field.Table.COLUMN_HOUR));
        }
        sqLiteDatabase.close();
        return id;
    }
    public String minute(int i){
        Table table = new Table(context);
        SQLiteDatabase sqLiteDatabase = table.getReadableDatabase();
        String column[] = {Field.Table.COLUMN_MINUTE};
        Cursor cursor = sqLiteDatabase.query(Field.Table.TABLE_NAME,column,null,null,null,null,null);
        cursor.moveToFirst();
        String id = null;
        if(cursor != null){
            cursor.moveToPosition(i);
            id = cursor.getString(cursor.getColumnIndexOrThrow(Field.Table.COLUMN_MINUTE));
        }
        sqLiteDatabase.close();
        return id;
    }
    public String state(int i){
        Table table = new Table(context);
        SQLiteDatabase sqLiteDatabase = table.getReadableDatabase();
        String column[] = {Field.Table.COLUMN_STATE};
        Cursor cursor = sqLiteDatabase.query(Field.Table.TABLE_NAME,column,null,null,null,null,null);
        cursor.moveToFirst();
        String id = null;
        if(cursor != null){
            cursor.moveToPosition(i);
            id = cursor.getString(cursor.getColumnIndexOrThrow(Field.Table.COLUMN_STATE));
        }
        sqLiteDatabase.close();
        return id;
    }

    public String setting(int i){
        Table table = new Table(context);
        SQLiteDatabase sqLiteDatabase = table.getReadableDatabase();
        String column[] = {Field.Table.COLUMN_SETTING};
        Cursor cursor = sqLiteDatabase.query(Field.Table.TABLE_NAME,column,null,null,null,null,null);
        cursor.moveToFirst();
        String id = null;
        if(cursor != null){
            cursor.moveToPosition(i);
            id = cursor.getString(cursor.getColumnIndexOrThrow(Field.Table.COLUMN_SETTING));
        }
        return id;
    }

    public long millis(int i){
        Table table = new Table(context);
        SQLiteDatabase sqLiteDatabase = table.getReadableDatabase();
        String column[] = {Field.Table.COLUMN_MILLI};
        Cursor cursor = sqLiteDatabase.query(Field.Table.TABLE_NAME,column,null,null,null,null,null);
        cursor.moveToFirst();
        long id = 0;
        if(cursor != null){
            cursor.moveToPosition(i);
            id = cursor.getLong(cursor.getColumnIndexOrThrow(Field.Table.COLUMN_MILLI));
        }
        sqLiteDatabase.close();
        return id;
    }
}

我也无法删除正确的项目。

Before Deletion After Deletion

我正在使用一个外部库来创建一个滑动菜单列表,其中每个项目都可以向右滑动以显示编辑或删除选项。 Link to Library MainActivity.java中的片段,用于删除项目

swipeMenuListView.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {
                switch (index){
                    case 0: //edit an item
                        Intent intent = new Intent(MainActivity.this,AlarmTimePickupPopup.class);
                        intent.putExtra("Time",alarmItems.get(position).getmHHmm());
                        startActivity(intent);
                        break;
                    case 1: //delete an item
                        Table table = new Table(MainActivity.this);
                        SQLiteDatabase sqLiteDatabase = table.getWritableDatabase();
                        sqLiteDatabase.delete(Field.Table.TABLE_NAME,Field.Table.COLUMN_HOUR_MINUTE+"="+"'"+alarmItems.get(position).getmHHmm()+"'",null);

                        sqLiteDatabase.close();
                        alarmItems.clear();
                        for(int i=0;i<count();i++){
                            alarmItems.add(new AlarmItem(hour(i),minute(i),HH(i),id(i),setting(i),state(i)));
                        }
                        alarmListAdapterl.notifyDataSetChanged();
                        Toast.makeText(MainActivity.this,"Deleted",Toast.LENGTH_SHORT).show();
                        break;
                }
                return false;
            }
        });

0 个答案:

没有答案