Как передать данные дооснащения в связке, чтобы просмотреть фрагменты пейджера из активности? - PullRequest
0 голосов
/ 10 июня 2019

В своей деятельности я получаю игровой идентификатор из предыдущей активности и, используя этот идентификатор, я получаю список данных из API. Метод («ApiCheats») в действии используется для получения списка данных.

Я хочу передать этот список моему фрагменту в пейджере представления, для этого я использовал пакет, но во фрагменте пакет равен нулю.

Как мне передать список комплектов во фрагмент, эти данные я получаю через модернизацию.

Это занятие

 public class GameListCheatsActivity extends AppCompatActivity {

    private final String TAG = GameListCheatsActivity.class.getSimpleName();
    public List<Cheats> Cheats;
    ArrayList cheats = new ArrayList<Cheats>();
 //   public RecyclerView recyclerView;
    String Gameid;
    ViewPager viewPager;
    ViewPagerAdapter adapter;
    TabLayout tabLayout ;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game_list_cheats);
//        recyclerView = (RecyclerView) findViewById(R.id.recycler_id);
//        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
//        recyclerView.setLayoutManager(linearLayoutManager);
//        recyclerView.setHasFixedSize(true);


        Gameid = getIntent().getStringExtra("GameID");
        tabLayout = (TabLayout) findViewById(R.id.tab_layout_id);
        viewPager = (ViewPager) findViewById(R.id.viewpager_id);
        adapter = new ViewPagerAdapter( getSupportFragmentManager());
        ApiCheats();
        adapter.AddFragment(new Fragment_Cheats(),"GameCheats");
        adapter.AddFragment(new Fragment_Favourites(),"Favourites");
        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager);




        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {
                if(state == 0){
                    View inflatedView = getLayoutInflater().inflate(R.layout.cheatitem, null);




                }
                if(state == 1){
                    View inflatedView = getLayoutInflater().inflate(R.layout.cheatitem, null);

                }

            }
        });




    }

    public void ApiCheats()
    {
        ApiUtil.getServiceClass().getAllCheats(Gameid).enqueue(new Callback<List<Cheats>>() {
            @Override
            public void onResponse(Call<List<Cheats>> call, Response<List<Cheats>> response) {
                if(response != null)
                {
                    if(response.isSuccessful())
                    {
                      Cheats =  response.body();

                        Bundle bundle = new Bundle();
                        bundle.putParcelableArrayList("cheatslist", (ArrayList<? extends Parcelable>) Cheats);
                        Fragment_Cheats fragment_cheats = new Fragment_Cheats();
                        fragment_cheats.setArguments(bundle);



                    }

                }
                Log.d(TAG, "Returned count " + Cheats.size());

                GameListCheatsActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                      //  CheatsAdapter adapter = new CheatsAdapter(getApplicationContext(), Cheats);
                      //  recyclerView.setAdapter(adapter);


                    }
                });

            }

            @Override
            public void onFailure(Call<List<Cheats>> call, Throwable t) {
                Log.d(TAG, "error loading from API");
            }
        });

    }



}

это один из фрагментов класса

public class Fragment_Cheats extends Fragment   {


    View v;
    private RecyclerView mrecyclerview;
    private List<Cheats> lstGameCheats;


    public Fragment_Cheats()
    {

    }


//    @Override
//    public void onCreate(@Nullable Bundle savedInstanceState) {
//        super.onCreate(savedInstanceState);
//
//        Bundle bundle = this.getArguments();
//        if (bundle != null) {
//            lstGameCheats = bundle.getParcelable("cheatslist");
//        }
//
//    }




    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.fragment_fragment__cheats, container, false);
        mrecyclerview = (RecyclerView)v.findViewById(R.id.recyclerview_cheats);

        Bundle bundle = this.getArguments();
        if (bundle != null) {
            lstGameCheats = bundle.getParcelable("cheatslist");
        }
        CheatsAdapter recyclerAdapter = new CheatsAdapter(getContext(),lstGameCheats);
        mrecyclerview.setLayoutManager(new LinearLayoutManager(getActivity()));
        mrecyclerview.setAdapter(recyclerAdapter);
        return  v;

    }

}

это вид пейджер-адаптера

    public class ViewPagerAdapter extends FragmentPagerAdapter {

    private final List<Fragment> lstFragment = new ArrayList<>();
    private final List<String> lstTitles = new ArrayList<>();


    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return lstFragment.get(position);
        //return null;
    }

    @Override
    public int getCount() {
        return lstTitles.size();
        //return 0;
    }

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


    public  void AddFragment(Fragment fragment,String title){

        lstFragment.add(fragment);
        lstTitles.add(title);
    }


}

1 Ответ

1 голос
/ 10 июня 2019
  1. Вы должны установить для Cheats Фрагмент, добавленный к вашему ViewPagerAdater, но в соответствии с вашим кодом вы просто установите данные для нового экземпляра фрагмента.

  2. В соответствии с кодом Fragment_Cheats, если вы хотите вызвать getArgument () в методе onCreate (), вы должны вызвать фрагмент.setArgument (), прежде чем фрагмент будет добавлен в ViewPagerAdapter.

Но в вашей ситуации это невозможно, поскольку данные поступают из сети.

Итак, два шага

  1. Установить правильные данные Fragment_Cheats экземпляр
  2. Уведомить Fragment_Cheats данные изменены, обновить состояние просмотра во фрагменте

Замените свой onResponse ()

@Override
public void onResponse(Call<List<Cheats>> call, Response<List<Cheats>> response) {
    if(response != null)
    {
        if(response.isSuccessful())
        {
            Cheats =  response.body();

            Fragment_Cheats fragment_cheats = adapter.getCheatFragment()
            fragment_cheats.setDatas(Cheats);
        }

    }
    Log.d(TAG, "Returned count " + Cheats.size());

    GameListCheatsActivity.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
          //  CheatsAdapter adapter = new CheatsAdapter(getApplicationContext(), Cheats);
          //  recyclerView.setAdapter(adapter);


        }
    });

}

Fragment_Cheats добавить setDatas() метод

 public void setDatas(List<Cheats> datas) {
       this.lstGameCheats = datas;
       // and set the datas to the RecylerView adapter
       recyclerviewAdapter.notifyDataSetChanged();
    }
...