Как обновить один фрагмент из другого в представлении пейджера android? - PullRequest
0 голосов
/ 25 января 2019

У меня есть видовой пейджер с двумя разными фрагментами.

 switch (i) {
            case 0:
                return LineChartOdoFragment.newInstance(msg, list, text, vehiclelist);
            case 1:
                return OdoTotalKmsFragment.newInstance(text, list, vehName, false, new OdoTotalKmsFragment.Updateable() {
                    @Override
                    public void update(TextView total_kms, TextView vehicle_name, RecyclerView odo_recycler) {

                        int total = 0;

                        for (int i = 0; i < list.size(); i++) {
                            total = total + (Integer.parseInt(list.get(i).getKms()) / 1000);
                        }

                        total_kms.setText("" + total);
                        vehicle_name.setText(vehName);

                        OdoKmsAdapter adapter = new OdoKmsAdapter(getActivity(), list);
                        odo_recycler.setLayoutManager(new LinearLayoutManager(getActivity()));
                        odo_recycler.setAdapter(adapter);

                    }
                });
            default:
                return LineChartOdoFragment.newInstance(msg, list, text, vehiclelist);
        }

Теперь у первого фрагмента есть счетчик, и он обновляется при выборе разных элементов.

Что я смотрюПоскольку значения обновляются в первом фрагменте, второй также должен обновляться.(Я также установил интерфейс во втором.)

Но второй никогда не обновляет и не сохраняет предыдущие значения.

Как мне обновить оба фрагмента сети?

Первый фрагмент вызывает асинхронную задачу, а обработчик обновляет оба фрагмента.

 private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        //myMessage.arg1
        //1 - Home page data




         if (msg.arg1 == 7) {

            odoReadingsModelList = (ArrayList) msg.obj;




            no_result_odo.setVisibility(View.GONE);
            lineChart.setVisibility(View.VISIBLE);
            lineChartOdo = new LineChartOdo(odoReadingsModelList, lineChart, context);
            lineChartOdo.createLineChartOdo();


  //updating second fragment
             OdoTotalKmsFragment.newInstance("", odoReadingsModelList, vehName, true, new OdoTotalKmsFragment.Updateable() {
                 @Override
                 public void update(TextView total_kms, TextView vehicle_name, RecyclerView odo_recycler) {

                     Log.e("LineChart Odo ", "Updating");

                     int total=0;

                     for (int i = 0; i < odoReadingsModelList.size(); i++) {
                         total = total + (Integer.parseInt(odoReadingsModelList.get(i).getKms()) / 1000);
                     }

                     total_kms.setText(""+total);
                     vehicle_name.setText(vehName);

                     OdoKmsAdapter adapter = new OdoKmsAdapter(getActivity(), odoReadingsModelList);
                     odo_recycler.setLayoutManager(new LinearLayoutManager(getActivity()));
                     odo_recycler.setAdapter(adapter);
                 }
             });





        } else if (msg.arg1 == 8) {

            String res = msg.obj.toString();



            lineChart.setVisibility(View.GONE);
            no_result_odo.setVisibility(View.VISIBLE);
            no_result_odo.setText("" + res);


        }
    }
};

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Я думаю, OdoTotalKmsFragment.newInstance() всегда даст вам новый объект OdoTotalKmsFragment, вы должны сохранить экземпляр как член, а затем обновить этот экземпляр члена.

0 голосов
/ 25 января 2019

Используйте EventBus для передачи данных из одного фрагмента в другой.

Полный пример из репозитория EventBus:

EventBus в 3 шага

Определить события:

public static class MessageEvent { /* Additional fields if needed */ }

Подготовка подписчиков: объявите и аннотируйте свой метод подписки, при необходимости укажите режим потока:

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};

Зарегистрируйте и отмените регистрацию вашего подписчика. Например, в Android действия и фрагменты обычно должны регистрироваться в соответствии с их жизненным циклом:

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}

Опубликовать события:

EventBus.getDefault().post(new MessageEvent());

для получения подробной информации читайте пример репозитория EventBus на github по этой ссылке

если вы не хотите использовать стороннюю библиотеку, используйте этот метод Чтобы обновить 1 фрагмент из другого, вы можете создать интерфейс в качестве обратного вызова и внедрить его в свою активность и 2-й фрагмент. Затем вы можете передать данные из одного фрагмента в другой.

...