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