Я создал два класса для управления своими сигналами тревоги и для создания собственного макета. В MyAlarm Activity я хочу управлять своими аварийными сигналами с помощью диалогового окна Time Picker и локальной базы данных, а MyListAdapter создаст нужный макет. Проблема в том, что listView.setOnItemClickListener
из MyAlarm не работает вообще. Как будто блок даже не существует. Вместо этого работают только mainViewholder.aSwitch.setOnClickListener
и mainViewholder.title.setOnClickListener
из MyListAdapter . Time Picker никогда не появляется, и я не знаю почему. Ниже приведены оба моих занятия. У меня вопрос, как я могу изменить код, чтобы, когда пользователь нажимает в любом месте, НО переключатель, появляется Time Picker для этой конкретной строки? И как мне также «прослушать» щелчки на самих переключателях?
MyAlarm:
@TargetApi(Build.VERSION_CODES.N)
public class MyAlarm extends AppCompatActivity {
DatabaseHelperActivity myDb;
ListView listView;
MyListAdaper ml;
int choiceFlag;
String[] alarms = {"Breakfast", "Lunch", "Dinner", "Morning Walk", "Noon Walk", "Evening Walk"};
Calendar calendar = Calendar.getInstance();
int requestCode = 0;
TimePickerDialog.OnTimeSetListener t = (view, hourOfDay, minute) -> {
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
updateLabelTime(hourOfDay, minute, requestCode);
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_my_alarm);
myDb = new DatabaseHelperActivity(this);
listView = findViewById(R.id.alarmList);
listView.setAdapter(new MyListAdaper(MyAlarm.this, R.layout.activity_custom_adapter, alarms));
listView.setOnItemClickListener((parent, view, position, id) -> {
requestCode = position;
int fl = ml.getFlag();
boolean checkFlag = ml.getCheckFlag();
switch (fl) {
case 1:
new TimePickerDialog(MyAlarm.this, t, calendar
.get(Calendar.HOUR_OF_DAY), calendar
.get(Calendar.MINUTE), true).show();
break;
case 0:
if(!checkFlag)
NotificationActivity.cancelReminder(MyAlarm.this, AlarmReceiverActivity.class, requestCode);
else
resetReminder(requestCode);
break;
default:
break;
}
});
/* listView.setOnItemClickListener((parent, view, position, id) -> {
requestCode = position;
new TimePickerDialog(MyAlarm.this, t, calendar
.get(Calendar.HOUR_OF_DAY), calendar
.get(Calendar.MINUTE), true).show();
});*/
}
private void updateLabelTime(int hourOfDay, int minute, int requestCode) {
NotificationActivity.setReminder(MyAlarm.this, AlarmReceiverActivity.class, hourOfDay, minute, requestCode);
AddData(requestCode,"true", hourOfDay,minute);
}
public void AddData(int id,String active, int hour, int minute) {
String h = Integer.toString(hour);
String m = Integer.toString(minute);
String ID = Integer.toString(id);
boolean flag = getData(id);
if (!flag) {
Toast.makeText(MyAlarm.this, "ADD", Toast.LENGTH_LONG).show();
boolean isInserted = myDb.insertData(ID, active, h, m);
if (isInserted)
Toast.makeText(MyAlarm.this, "Data Inserted", Toast.LENGTH_LONG).show();
else
Toast.makeText(MyAlarm.this, "Data could not be Inserted", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MyAlarm.this,"UPDATE", Toast.LENGTH_LONG).show();
updateData(id, hour, minute);
}
}
public void resetReminder(int requestCode){
boolean flg = false;
int hr;
int mn;
String id = Integer.toString(requestCode);
Cursor res = myDb.getData(id);
String data = null;
if (res.moveToPosition(requestCode)) {
if (res.getPosition() != 0)
flg = true;
}
if(flg){
hr = Integer.parseInt(res.getString(2));
mn = Integer.parseInt(res.getString(3));
NotificationActivity.setReminder(MyAlarm.this,AlarmReceiverActivity.class,hr,mn,requestCode);
}
}
public boolean getData(int i) {
String id = Integer.toString(i);
Cursor res = myDb.getData(id);
String data = null;
if (res.moveToPosition(i)) {
data = "Id:"+res.getString(0)+"\n"+
"Active :"+ res.getString(1)+"\n\n"+
"Hour :"+ res.getString(2)+"\n\n"+
"Minute :"+ res.getString(3)+"\n\n";
}
Toast.makeText(MyAlarm.this, "Data: "+ data, Toast.LENGTH_SHORT).show();
return !res.isNull(i);
}
public void updateData(int i, int hour, int minute){
String id = Integer.toString(i);
String h = Integer.toString(hour);
String m = Integer.toString(minute);
boolean isUpdate = myDb.updateData(id,"true",h,m);
if(isUpdate)
Toast.makeText(MyAlarm.this,"Data Update",Toast.LENGTH_LONG).show();
else
Toast.makeText(MyAlarm.this,"Data could not be Updated",Toast.LENGTH_LONG).show();
}
}
MyListAdapter:
class MyListAdaper extends ArrayAdapter<String> {
private MyAlarm ma = new MyAlarm();
private int layout;
private boolean checkFlag = false;
private int flag = -1;
private String[] mObjects;
OnItemClickListener listener = null;
MyListAdaper(Context context, int resource, String[] objects) {
super(context, resource, objects);
mObjects = objects;
layout = resource;
}
@NonNull
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
ViewHolder mainViewholder = null;
AtomicInteger pos = new AtomicInteger();
if(convertView == null) {
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(layout, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.title = convertView.findViewById(R.id.tableText);
viewHolder.linView = convertView.findViewById(R.id.tableID);
viewHolder.title.setBackgroundColor(Color.WHITE);
viewHolder.title.setTextColor(Color.BLACK);
viewHolder.aSwitch = convertView.findViewById(R.id.mySwitch);
viewHolder.linView = convertView.findViewById(R.id.alarmList);
convertView.setTag(viewHolder);
}
mainViewholder = (ViewHolder) convertView.getTag();
ViewHolder finalMainViewholder = mainViewholder;
mainViewholder.aSwitch.setOnClickListener(v ->
{
checkFlag = finalMainViewholder.aSwitch.isChecked();
setCheckFlag(checkFlag);
flag = 0;
setFlag(flag);
});
mainViewholder.title.setOnClickListener(v -> {
pos.set(position);
flag = 1;
setFlag(flag);
}
);
mainViewholder.title.setText(getItem(position));
mainViewholder.aSwitch.setChecked(getCheckFlag());
return convertView;
}
private void setFlag(int fl){
this.flag = fl;
}
int getFlag(){
return this.flag;
}
private void setCheckFlag(boolean cF){
this.checkFlag = cF;
}
boolean getCheckFlag(){
return this.checkFlag;
}
}
class ViewHolder {
TextView title;
Switch aSwitch;
LinearLayout linView;
}