ExpandableListAdapter |Удалить группу и добавить ребенка - оба по нажатию кнопки - PullRequest
0 голосов
/ 28 мая 2019

Я создаю небольшое приложение, используя базу данных Firebase Real Time.

В приложении перечислены смены на конкретную дату.

Каждая смена отображается как элемент группы, а каждый зарегистрированный сотрудникэтот сдвиг отображается как дочерний в этой группе.

Я использовал ArrayList класса ParentHeader для групповых элементов и ArrayList of Strings для дочерних элементов (для отображения имени сотрудника) - это можетизменение в будущем для более сложного объекта.

Мой код:

    public class DateActivity extends ExpandableListActivity {
    // date and isAdmin are passed to this activity using shared preferences 
        private String date;
        private boolean isAdmin;
        // Adapter declaration
        private CustomExpandableListAdapter mAdapter;
        // ArrayList to store group items
        private ArrayList<ParentHeader> parents = new ArrayList<>();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_date);
     // initialize date and isAdmin here

            // Fetch all shifts for selected date from Firebase
            Validator.fetchShiftsPerDayFromDB(date, new Callback()
            {
                @Override
                void shiftsCallback(ArrayList<Shift> shifts)
                {
                    super.shiftsCallback(shifts);
                    if (shifts == null)
                        return;

                    for(Shift shift : shifts){
                        parents.add(new ParentHeader(shift));
                    }

                    mAdapter = new CustomExpandableListAdapter();
                    setListAdapter(mAdapter);
                }
            });
}

    private class CustomExpandableListAdapter extends BaseExpandableListAdapter
    {
        private LayoutInflater inflater;

        public CustomExpandableListAdapter()
        {
            // Create Layout Inflator
            inflater = LayoutInflater.from(DateActivity.this);
        }

        @Override
        public int getGroupCount()
        {
            return parents.size();
        }

        @Override
        public int getChildrenCount(int groupPosition)
        {
            int size = 0;
            if(parents.get(groupPosition).getEmployeesList() != null)
                size = parents.get(groupPosition).getEmployeesList().size();
            return size;
        }

        @Override
        public Object getGroup(int groupPosition)
        {
            return parents.get(groupPosition);
        }

        @Override
        public Object getChild(int groupPosition, int childPosition)
        {
            return parents.get(groupPosition).getEmployeesList().get(childPosition);
        }

        @Override
        public long getGroupId(int groupPosition)
        {
            return groupPosition;
        }

        @Override
        public long getChildId(int groupPosition, int childPosition)
        {
            return childPosition;
        }

      @Override
        public boolean hasStableIds()
        {
            return true;
        }

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parentView)
        {
                final ParentHeader parentHeader = parents.get(groupPosition);

                // Inflate group_row.xml file for group rows
                convertView = inflater.inflate(R.layout.group_row, parentView, false);
// Get group_row.xml file elements and set values here

            //Add User to selected shift
            convertView.findViewById(R.id.add).setOnClickListener(v -> {
                //TODO insert constraints
               Validator.addUserToShiftInDB(parentHeader.getShift().getKey(), date, userName, new Callback() {
                   @Override
                   void onUserAssignedToShiftCallback() {
                       super.onUserAssignedToShiftCallback();
                        // TODO attach as child-item to chosen group-item 
                   }
               });

            });

                convertView.findViewById(R.id.delete).setOnClickListener(v -> {
                    if(isAdmin){
                        //TODO open confirmation window
                        Validator.deleteShiftFromDateInDB(parentHeader.getShift().getKey(), date, new Callback() {
                            @Override
                            void onDeletedShiftCallback() {
                                super.onDeletedShiftCallback();
// shift gets deleted in Firebase but the expandable list does not refresh
                                parents.remove(groupPosition);
                                mAdapter.notifyDataSetChanged();
                            }
                        });

                    }
                    else{
                        Toast.makeText(getApplicationContext(),"Admin privileges required", Toast.LENGTH_SHORT).show();
                    }
                });
                return convertView;
        }

          @Override
        public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parentView)
        {
            final ParentHeader parentHeader = parents.get(groupPosition);
            final String childString = parentHeader.getEmployeesList().get(childPosition);

            // Inflate child_row.xml file for child rows
            convertView = inflater.inflate(R.layout.child_row, parentView, false);

            // Get child_row.xml file elements and set values here

            return convertView;
        }

        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition)
        {
            return true;
        }

        @Override
        public boolean areAllItemsEnabled()
        {
            return true;
        }

        @Override
        public boolean isEmpty()
        {
            return ((parents == null) || parents.isEmpty());
        }

        @Override
        public void notifyDataSetChanged()
        {
            // Refresh List rows
            super.notifyDataSetChanged();
        }
    }
}

Это класс ParentHeader, который хранит данные о каждом элементе группы.

public class ParentHeader {
    private Shift shift;
    private boolean isDeleteButtonClicked, isAddButtonClicked, isHeaderClicked;
    // Array to store child objects
    private ArrayList<String> employeesList = new ArrayList<>();

    public ParentHeader() { }

    public ParentHeader(Shift shift) {
        this.shift = shift;
    }

// Getters/Setters here
}

и, наконец, класс Shift, в котором хранятся данные для каждой смены.

public class Shift {
    private String startTime, endTime, name, key;
    private Integer wage, numOfEmps, employees;


    public Shift(){}

    public Shift(String name, String startTime, String endTime, Integer wage, Integer numOfEmps, Integer employees) {
        this.startTime = startTime;
        this.endTime = endTime;
        this.name = name;
        this.wage = wage;
        this.numOfEmps = numOfEmps;
        this.employees = employees;

    }
//Getters/Setters here
}

Первая проблема

Удаление элемента группы из ExpandableListAdapter при нажатии кнопки наparent-item.

Как вы можете видеть выше, я звоню parents.remove, а затем notifyDataSetChanged, но список не обновляется.

Это, однако, работает, если я перезагружаю действие.

Я хочу, чтобы оно работало динамически.

Вторая проблема

Добавление дочернего элемента в группу при нажатии кнопки родительского элемента.

Моя база данных имеет следующую структуру:

added shift

КогдаАдминистратор добавил новую смену к дате.

Теперь я хочу, чтобы каждый пользователь имел возможность назначить себя для одной из смен и чтобы его имя отображалось в качестве дочернего элемента для этого.сдвиг групповых элементов.

После того, как они щелкнули по выбранной смене групповых элементов, их данные должны быть сохранены в Firebase следующим образом:

name stored

Я хочу, чтобы каждое имя, хранящееся в employees, отображалось как дочерний элемент при соответствующем сдвиге группового элемента.Динамически, конечно.

Буду признателен за помощь в решении этих двух проблем.Я новичок в разработке Android и не очень разбираюсь в этом.

Спасибо.

...