Пользовательский класс адаптера не работает должным образом - PullRequest
0 голосов
/ 30 октября 2018

Я создал два класса для управления своими сигналами тревоги и для создания собственного макета. В 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;
}
...