@samarjan

Как контролировать одновременный запуск фрагментов по клику на элемент списка?

Имеется фрагмент со списком, по нажатию на элемент списка происходит создание нового фрагмента, и добавление его во FragmentManager, отображение и скрытие фрагмента со списком. Стандартная задача. Проблема заключается в том, что если одновременно нажать по двум элементам списка, то будут создаваться два фрагмента и класться во FragmentManager и отображаться одновременно, а желательно что бы создавался только один фрагмент.
executePendingTransactions() не помогает
Сейчас реализовал с помощью триггера в виде булевой переменной, которая пропускает событие клика, если оно уже было нажато, но до тех пор пока не будет уничтожен фрагмент, вызванный по нажатию на элемент списка. Информация о уничтожении детального фрагмента передаётся через интерфейс, который реализует фрагмент со списком.

Возможно ли сделать это как-то иначе?

public class ListFragment extends Fragment implements DetailFragmentFragment.onDetailFragmentLifeCycleListener {
	private boolean isTransactionPerforming = false;

	...
	@Override
	public void onClick(Data someData) {
		if (!isTransactionPerforming) {
			isTransactionPerforming = true;
		} else {
			return;
		}
		DetailFragment DetailFragment = new DetailFragment();
		DetailFragment.setMyData(someData);
		DetailFragment.setFragmentVisible();
		DetailFragment.setDetailLifeCycleListener(this);
		getActivity().getSupportFragmentManager()
				.beginTransaction()
				.hide(currntListFragment)
				.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
				.add(R.id.List_frameLayout, DetailFragment)
				.addToBackStack("details")
				.commitAllowingStateLoss();
	}

	@Override
	public void onShown() {
		isTransactionPerforming = false;
	}
	...
}

public class DetailFragment extends Fragment {

	...

	@Override
    public void onDestroy() {
        super.onDestroy();
        if (mDetailLifeCycleListener != null)
            mDetailLifeCycleListener.onShown();
    }

    ...

    public onDetailLifeCycleListener mDetailLifeCycleListener;

    public void setDetailLifeCycleListener(onDetailLifeCycleListener mDetailLifeCycleListener) {
        this.mDetailLifeCycleListener = mDetailLifeCycleListener;
    }

    public interface onDetailLifeCycleListener {
        public void onShown();
    }
}
  • Вопрос задан
  • 138 просмотров
Решения вопроса 1
@IceJOKER
Web/Android developer
у списка сделать CHOICE_MODE SINGLE?
у фрагмент менеджера вызвать replace вместо add ?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы