1.3 Настройка ContactsFragment

Следующий шаг - перенос логики из MainActivity в ContactsFragment.

Изначально, необходимо реализовать интерфейс для реализации удаления записи. В нашем случае, интерфейс ContactsAdapter.DeleteItemListener будет реализовывать не MainActivity, а ContactsFragment. Код для удаления контакта пока прописывать не будем.

ContactsFragment.java
public class ContactsFragment extends Fragment implements ContactsAdapter.DeleteItemListener {

    ...

    @Override
    public void onDeleteItem(int position) {
        // TODO: удаление контакта из списка 
    }
}

Теперь добавим нужные поля

ContactsFragment.java
public class ContactsFragment extends Fragment implements ContactsAdapter.DeleteItemListener {

    private RecyclerView mRecyclerView;
    private ContactsAdapter adapter;
    private List<Contact> list = new ArrayList<>();


    public ContactsFragment() {
        // Required empty public constructor
    }

    @Override
    public void onDeleteItem(int position) {
        // TODO: удаление контакта из списка
    }
}

Теперь в методе onViewCreated() настроим RecyclerView с контактами и нажатие на FloatingActionButton для добавления нового контакта.

ContactsFragment.java
public class ContactsFragment extends Fragment implements ContactsAdapter.DeleteItemListener {

    ...

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        
        mRecyclerView = view.findViewById(R.id.list);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
        adapter = new ContactsAdapter(requireContext(), list, this);
        mRecyclerView.setAdapter(adapter);

        view.findViewById(R.id.fab).setOnClickListener(v -> {
            requireActivity().getSupportFragmentManager()
                    .beginTransaction()
                    .setReorderingAllowed(true)
                    .add(R.id.container, AddContactFragment.class, null)
                    .addToBackStack("add_contact")
                    .commit();
        });
    }
}

Обратите внимание на код нажатия на кнопку добавления контакта. С помощью метода requireActivity() мы получаем доступ к родительскому activity, вызываем метод getSupportFragmentManager() и добавляем фрагмент AddContactFragment в контейнер. Метод setReorderingAllowed(true) нужен для оптимизации добавления фрагмента, метод addToBackStack() нужен для добавления фрагмента в стек фрагментов (это нам понадобится, когда мы будем программировать нажатие кнопки назад).

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

На данный момент, полный код класса ContactsFragment выглядит следующим образом.

ContactsFragment.java
public class ContactsFragment extends Fragment implements ContactsAdapter.DeleteItemListener {

    private RecyclerView mRecyclerView;
    private ContactsAdapter adapter;
    private List<Contact> list = new ArrayList<>();

    public ContactsFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_contacts, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        mRecyclerView = view.findViewById(R.id.list);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
        adapter = new ContactsAdapter(requireContext(), list, this);
        mRecyclerView.setAdapter(adapter);

        view.findViewById(R.id.fab).setOnClickListener(v -> {
            requireActivity().getSupportFragmentManager()
                    .beginTransaction()
                    .setReorderingAllowed(true)
                    .add(R.id.container, AddContactFragment.class, null)
                    .addToBackStack("add_contact")
                    .commit();
        });
    }

    @Override
    public void onDeleteItem(int position) {
        // TODO: удаление контакта из списка
    }
}

Last updated