Есть ли способ передать массив из onDataChange во внутренний класс ViewPagerAdapter фрагмента? - PullRequest
0 голосов
/ 12 апреля 2020

Не знаю, как отправить массив, заполненный в onDataChanged, в метод, который вызывается для создания нового фрагмента, чтобы передать его с объектом связки

Я пытался связываться с конструктором в ожидайте его как параметр и в теле конструктора появится как «не пустой», но после этого я не знаю, как отправить его в метод addFragment, так как я пробовал и кажется «нулевым». Я пытался получить к нему доступ как MainActivity.this.arraylist, но он говорит, что пуст. я сделал это stati c и он все еще говорит, что он пуст

publi c class MainActivity расширяет AppCompatActivity {

private TabLayout tablayout;
private ViewPager viewpager;

private Temperatura temperatura;
private Humedad humedad;
private Viento viento;
private Info informacion;

List<String> Lecturabundle = new ArrayList<>();

DatabaseReference mDatabase;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mDatabase = FirebaseDatabase.getInstance().getReference();

    tablayout = findViewById(R.id.tablayout);
    viewpager = findViewById(R.id.viewpager);


    temperatura = new Temperatura();
    humedad = new Humedad();
    viento = new Viento();
    informacion = new Info();

    tablayout.setupWithViewPager(viewpager);


    ViewPagerAdapter viewpageradapter = new ViewPagerAdapter(getSupportFragmentManager(), 0);

    mDatabase.child("lectura").child("hora").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

          Lecturabundle.add(dataSnapshot.getValue().toString());

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            System.out.println("The read failed: " + databaseError.getCode());
        }
    });



    viewpageradapter.addFragment(temperatura, "Temperatura");
    viewpageradapter.addFragment(humedad, "Humedad");
    viewpageradapter.addFragment(viento, "Viento");
    viewpageradapter.addFragment(informacion, "info");


    viewpager.setAdapter(viewpageradapter);
}

private class ViewPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments = new ArrayList<>();
    private List<String>  fragmentTitle = new ArrayList<>();



    public ViewPagerAdapter(@NonNull FragmentManager fm, int behavior) {
        super(fm, behavior);

    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    public void addFragment(Fragment fragment, String title, List<String> recibeArrayList){

ЗДЕСЬ ГДЕ НУЖНО БЫТЬ, ЧТОБЫ БЫТЬ, ЧТО Я МОГУ ОТПРАВИТЬ ЭТО КАЖДОЙ ФРАГМЕНТ, НО Я НЕ ЗНАЮ, КАК ЭТО СДЕЛАТЬ ПРАВИЛЬНЫМ СПОСОБОМ С ТОГО, ЧТО Я ПОПРОБОВАЛ, ДАЕТ МНЕ ТОЧКУ, ГДЕ КОГДА ЭТО НАКОНЕЦ ЗДЕСЬ () ГОВОРИТ TRU

        Bundle b = new Bundle();
        b.putStringArrayList("recibe", (ArrayList<String>) Lecturabundle);
        fragment.setArguments(b);


        fragments.add(fragment);
        fragmentTitle.add(title);

    }


    @Override
    public int getCount() {
        return fragments.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return fragmentTitle.get(position);
    }
}

}

Мне нужно, чтобы Lecturabundle был в addFragment, чтобы я мог передать его как связку с фрагментами

1 Ответ

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

Правильный путь - использовать Bundle, чтобы передать его вашему фрагменту. Но в вашем случае вы создаете / инициализируете фрагмент в onCreate, и метод onDataChanged вызывается через некоторое время, и вы можете сказать, что это может занять от нескольких секунд до нескольких минут, в зависимости от данных. Поэтому, если вы хотите отправить эти данные в свой фрагмент, вы можете создать метод publi c в своем классе фрагмента, скажем, назвать его как newDataInserted (list) со списком в качестве параметра. теперь вы можете вызывать этот метод внутри onDataChanged (), используя экземпляр вашего фрагмента, который вы создали ранее. Например

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
      Lecturabundle.add(dataSnapshot.getValue().toString());
      if(temperature != null) {
         temperatura.newDataInserted(Lecturabundle);
      }
}
...