Как получить фрагмент из диалога, который запускается из recyclerView - PullRequest
0 голосов
/ 12 июня 2018

Так что в основном у меня есть диалог, где пользователь вводит данные.Этот диалог запускается из recyclerView с пользовательским адаптером.Мне нужно вызвать notifyDataSetChanged для фрагмента из диалогового окна после того, как пользователь нажмет «Готово».

Как мне это сделать?

Код:

public class FoodListAdapter extends RecyclerView.Adapter<FoodListAdapter.ViewHolder>
    implements View.OnClickListener {
    //blabla

    @Override
    public void onClick(View v) {
        int position = (int) v.getTag();
        String foodItemTitle = mFoodItemList.get(position).getTitle();

        FoodEditDietDialog dialog = new FoodEditDietDialog();
        dialog.show(fm, mFoodItemList.get(position).getTimeStamp());
    }


public class Fragment extends Fragment {
    //blabla

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

    foodList = databaseHelper.getList("somethingsomething");
    recyclerView = Fragment.findViewById(R.id.list);
    recyclerView.setHasFixedSize(false);
    layoutManager = new LinearLayoutManager(this.getContext());
    recyclerView.setLayoutManager(layoutManager);
    adapter = new FoodListAdapter(fm, foodList);
    recyclerView.setAdapter(adapter);
}

public class FoodEditDietDialog extends DialogFragment {
    //blabla

    button = dialog.findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            databaseHelper.doSomething();
            dismissDialog();
            //TODO: call method in dietFragment to notify adapters
        }
    });
}

1 Ответ

0 голосов
/ 12 июня 2018

Вы должны сделать это через свой хостинг. Activity.

public interface DataChangeListener {
    void onDataChange();
}

public class YourActivity extends Activity implements DataChangeListener {

    private List<DataChangeListener> dataChangeListeners = new ArrayList<>();

    @Override
    public void onDataChange() {
        for(DataChangeListener listener in dataChangeListeners) {
            listener.onDataChange();
        }
    }

    public void addDataChangeListener(DataChangeListener listener) {
        dataChangeListeners.add(listener);
    }

    public void removeDataChangeListener(DataChangeListener listener) {
        dataChangeListeners.remove(listener);
    }
}

public class Fragment extends Fragment implements DataChangeListener {

    @Override
    public void onAttach(Activity activity) {
        if (activity instanceOf YourActivity) {
            activity.addDataChangeListener(this)
        }
    }

    @Override
    public void onDetach() {
        Activity activity = getActivity();
        if (activity instanceOf YourActivity) {
            activity.removeDataChangeListener(this)
        }
    }

    @Override
    public void onDataChange() {
        adapter.notifyDataSetChanged();
    }
}

public class FoodEditDietDialog extends DialogFragment {
    //blabla

    button = dialog.findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            databaseHelper.doSomething();
            dismissDialog();

            //TODO: call method in dietFragment to notify adapters
            Activity activity = getActivity();
            if (activity instanceOf DataChangeListener) {
                activity.onDataChange();
            }
        }
    });
}

Таким образом, в основном диалог будет вызывать активность, активность будет уведомлять фрагмент, фрагмент будет уведомлять адаптеры.В качестве альтернативы, вы можете передать свой фрагмент (как DataChangeListener) своему адаптеру и вашему диалогу.И позвони оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...