Как мне обновить мой фрагмент после изменения данных в моей деятельности (SQLite)? - PullRequest
1 голос
/ 06 апреля 2020

У меня есть ListView во фрагменте, который заполняется при запуске приложения. Я помещаю ParcelableArrayList в Bundle в своем методе newInstance и возвращаю его обратно в свой OnCreateView после передачи ArrayList в метод newInstance в моей Activity (то есть данных, считанных из базы данных SQLite).

This часть работает, так как я правильно отображаю свои данные в своем фрагменте.

Я реализовал кнопку, которая удаляет все данные из таблицы, и теперь я хотел бы обновить свое представление после очистки таблицы. Кнопка «удалить все» обрабатывается в моей основной деятельности, когда я вызываю обработчик базы данных, чтобы очистить таблицу.

Каков наилучший способ сделать это? Вот части кода, которые кажутся мне актуальными:

Мой класс фрагмента:

public class MainFragment extends Fragment {

    public static final String RECETTES_KEY = "recettes_key";
    private List<Recette> mRecettes;
    private ListView mListView;

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

    public static MainFragment newInstance(List<Recette> r) {
        MainFragment fragment = new MainFragment();
        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList(RECETTES_KEY, (ArrayList<? extends Parcelable>) r);
        fragment.setArguments(bundle);

        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        mRecettes = getArguments().getParcelableArrayList(RECETTES_KEY);
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_main, container, false);
    }

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

    // Configure ListView
    private void configureListView(){
        this.mListView = getView().findViewById(R.id.activity_main_list_view);
        RecetteAdapter adapter = new RecetteAdapter(getContext(), mRecettes);
        mListView.setAdapter(adapter);
    }
}

Соответствующие части из моей основной деятельности: Это в моем методе OnCreate:

mDatabaseHandler = new DatabaseHandler(this);
mRecettes = mDatabaseHandler.readRecettes();
mDatabaseHandler.close();

Это метод, который я использую для показа фрагмента:

if (this.mMainFragment == null) this.mMainFragment = MainFragment.newInstance(mRecettes);
this.startTransactionFragment(this.mMainFragment);

Дайте мне знать, если я добавлю больше своего кода, это мой первый пост :) Lucile

1 Ответ

0 голосов
/ 06 апреля 2020

В вашем R.layout.fragment_main вы можете добавить идентификатор к представлению root, скажем, с помощью android:id@+id/fragment_root

И всякий раз, когда вы хотите изменить представление фрагмента:

В действии :

MainFragment fragment = (MainFragment) getSupportFragmentManager().getFragmentById(R.id.fragment_root);
fragment.updateList(mRecettes);

И затем создайте новый метод updateList() в вашем MainFragment

public void updateList(List<Recette> recettes) {
    mRecettes.clear();
    mRecettes.addAll(recettes);
    configureListView();
}

Также вы можете пометить свой фрагмент, когда добавляете его в свою транзакцию вместо использования его id, а затем используйте getSupportFragmentManager().getFragmentByTag()

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