如何在捆绑中传递改造数据以查看活动中的寻呼机片段?

时间:2019-06-10 11:23:53

标签: android-fragments android-recyclerview android-viewpager retrofit2 bundle

在我的活动中,我从上一个活动中收到一个游戏ID,并使用此ID从api中获取数据列表。活动中的“ ApiCheats”方法用于获取少量数据。

我想将此列表传递给View分页器中的片段,为此我使用了包,但在片段中该包为空。

我应该如何将捆绑包列表传递给fragment,这些数据是我通过改型获得的。

这是活动

 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 个答案:

答案 0 :(得分:1)

  1. 您应该将Cheats设置为已添加到ViewPagerAdater的分片,但是根据您的代码,您只是将数据设置为新的分片实例。

    < / li>
  2. 根据Fragment_Cheats代码,如果要在onCreate()方法中调用getArgument(),则应在将片段添加到ViewPagerAdapter之前先调用fragment.setArgument()。

但是在您的情况下,这是不可能的,因为数据是从网络获取的。

所以,两步

  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();
    }