Как установить startActivityForResult из адаптера и получить результат во фрагменте viewPager - PullRequest
0 голосов
/ 11 ноября 2018

Я знаю, что есть несколько связанных тем, но я перепробовал их все, и ничего не происходит. У меня есть класс «MainActivity», который содержит фрагмент с именем «HomeFragment», в котором этот фрагмент содержит viewPager с двумя фрагментами, один из которых называется «ListFragment». При настройке адаптера с именем «ListAdapter» метод onClick для каждого элемента работает нормально, проблема заключается в том, что я установил:

                intentRequestDetails.putExtra(KEY_POSITION, position);
                intentRequestDetails.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                ((Activity) context).startActivityForResult(intentRequestDetails, 2);

для включения нажмите в адаптере, Я не знаю, как получить результат в «ListFragment». Я передаю "getActivity ()" для адаптера и ListFragment, но ни один из них не сработал! Пожалуйста, помогите мне с этим, чтобы получить результат в "ListFragment"

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 2) {
        if (resultCode == Activity.RESULT_OK) {
            int position = data.getIntExtra("position", -1);
            userRequestsViewModel.getResult().remove(position);
            viewHolder.rView.getAdapter().notifyItemRemoved(position);
            viewHolder.rView.getAdapter().notifyItemRangeChanged(position, viewHolder.rView.getAdapter().getItemCount());

        } else if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }

Что мне нужно что передать от фрагмента к адаптеру в качестве контекста? где и как переопределить onActivityResult и есть ли что-то еще, что я пропустил?

  • onActivityResult в ListFragment не срабатывает, так как startActivityForResult вызывается из ListAdapter! Как мне справиться с этим?
  • Как получить адаптер и ListFragment в MainActivity, если есть шанс обновить список?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

После долгих часов исследований я наконец-то решил эту проблему следующим образом: Поскольку у меня есть два вложенных фрагмента как дочерний и родительский в одном действии, и я планирую принять меры по каждому элементу, щелкните элементы recyclerView и перейдите к другому действию, чтобы получить результат и обновив список, я добавил этот код в MainActivity:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().getFragments().get(1);
    fragment.onActivityResult(requestCode, resultCode, data);
}

, который выбирает целевой фрагмент (parentFragment) для передачи данных, а затем в этот родительский фрагмент я добавляю этот метод:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getChildFragmentManager().getFragments().get(1);
    fragment.onActivityResult(requestCode, resultCode, data);
}

для отправки onActivityResult дочернему фрагменту. Ведь в дочернем фрагменте:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == 2){
        if (resultCode == Activity.RESULT_OK) {
            int position = data.getIntExtra("position", -1);
            userRequestsViewModel.getResult().remove(position);
            viewHolder.rView.getAdapter().notifyItemRemoved(position);
            viewHolder.rView.getAdapter().notifyItemRangeChanged(position, viewHolder.rView.getAdapter().getItemCount());
        }
    }
}

чтобы обновить адаптер recyclerView и уведомить его об удалении предмета! Другим важным моментом является то, что в адаптере я только что сделал это:

Intent intent = new Intent(view.getContext(), SecondActivity.class);

                intent.putExtra(KEY_POSITION, position);
                ((Activity) context).startActivityForResult(intent, 2);

и удалите эту строку кода:

intentRequestDetails.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

и, конечно, я передал контекст действия от фрагмента к адаптеру: просто

getContext()

Надеюсь, это сработает и у вас, если вы однажды столкнетесь с такой проблемой

0 голосов
/ 11 ноября 2018

Помимо переопределения onActivityResult во фрагменте, вам также необходимо переопределить его в классе активности:

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Fragment fragment = getSupportFragmentManager().findFragmentById("yourFragment"); 
    fragment.onActivityResult(requestCode, resultCode, data); 
}

и во фрагменте:

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   //do something
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...