Android - 如何将数据从 Activity 适配器发送到 TabLayout?

Android - How to send data from Activity Adapter to TabLayout?

我正在尝试将数据从适配器 class 发送到具有 TabLayout 的 Activity class。但是我得到 NullPointerException。我搜索了一些答案并使用了一个,但它对我不起作用。

这是代码

适配器Class

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    final Player player = playerList.get(position);
    holder.playerName.setText(player.getPlayerName());
    Picasso.get().load(player.getProfilePhoto()).placeholder(R.drawable.ic_default_pic)
            .into(holder.playerImage);
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(mContext, PlayerProfile.class);
            intent.putExtra("playerId", player.getPlayerID());
            intent.putExtra("team", player.getPlaysFor());
            mContext.startActivity(intent);
        }
    });

}

Activity Class 有 TabLayout

public class PlayerProfile extends AppCompatActivity {


public String playerId, team;
TabLayout tabLayout;
ViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_player_profile);
    tabLayout = findViewById(R.id.tabLayout);

    viewPager = findViewById(R.id.viewPager);

    Intent intent = getIntent();
    playerId = intent.getStringExtra("playerId");
    team = intent.getStringExtra("team");

    ViewPageAdapter viewPageAdapter = new ViewPageAdapter(getSupportFragmentManager());
    viewPageAdapter.addFragment(new PlayerInfo(), "Player Info");
    viewPageAdapter.addFragment(new CurrentStats(), "Current Stats");
    viewPageAdapter.addFragment(new WholeIPL(), "Whole Stats");


    Bundle bundle = new Bundle();
    bundle.putString("playerId", playerId);
    bundle.putString("team", team);

    PlayerInfo info = new PlayerInfo();
    CurrentStats stats = new CurrentStats();
    WholeIPL ipl = new WholeIPL();

    info.setArguments(bundle);
    stats.setArguments(bundle);
    ipl.setArguments(bundle);

    viewPager.setAdapter(viewPageAdapter);
    tabLayout.setupWithViewPager(viewPager);
}

static class ViewPageAdapter extends FragmentPagerAdapter {

    private ArrayList<Fragment> fragments;
    private ArrayList<String> titles;

    ViewPageAdapter(@NonNull FragmentManager fm) {
        super(fm);
        this.fragments = new ArrayList<>();
        this.titles = new ArrayList<>();
    }

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

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

    void addFragment(Fragment fragment, String title) {
        fragments.add(fragment);
        titles.add(title);
    }

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

TabLayout 片段

    public class PlayerInfo extends Fragment {

String playerID, team;
TextView name, dob, batting, bowling, jersey;
CircleImageView circleImageView;

DatabaseReference databaseReference;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_player_info, container, false);

    Bundle bundle = this.getArguments();
    assert bundle != null;
    playerID = bundle.getString("playerId");
    team = bundle.getString("team");

    Log.d(TAG, "onCreateView: " + playerID);
}

它在 Log 语句中显示为空。那么,关于如何将 playerId 传递给 Fragment 有什么建议吗?

您首先传递新片段,然后定义新片段并对它们使用 setArguments,但未使用它们。 具体看这几行代码:

    ViewPageAdapter viewPageAdapter = new ViewPageAdapter(getSupportFragmentManager());
    viewPageAdapter.addFragment(new PlayerInfo(), "Player Info");
    viewPageAdapter.addFragment(new CurrentStats(), "Current Stats");
    viewPageAdapter.addFragment(new WholeIPL(), "Whole Stats"); 

在这里,您将新的 Fragment 传递给 addFragment,在这里:

    Bundle bundle = new Bundle();
    bundle.putString("playerId", playerId);
    bundle.putString("team", team);

    PlayerInfo info = new PlayerInfo();
    CurrentStats stats = new CurrentStats();
    WholeIPL ipl = new WholeIPL();

    info.setArguments(bundle);
    stats.setArguments(bundle);
    ipl.setArguments(bundle);

    viewPager.setAdapter(viewPageAdapter);
    tabLayout.setupWithViewPager(viewPager);

您正在创建片段的新实例并对它们使用 setArguments,并且新片段以后永远不会被使用。 考虑将您的适配器定义和 addFragments 移动到 setArguments 下面并使用定义的片段。

Bundle bundle = new Bundle();
    bundle.putString("playerId", playerId);
    bundle.putString("team", team);

    PlayerInfo info = new PlayerInfo();
    CurrentStats stats = new CurrentStats();
    WholeIPL ipl = new WholeIPL();

    info.setArguments(bundle);
    stats.setArguments(bundle);
    ipl.setArguments(bundle);

Above code is required for creating instances for fragment and setting value to them. 
You need to use these instances of fragment to the ViewPagerAdapter (As shown)

ViewPageAdapter viewPageAdapter = new ViewPageAdapter(getSupportFragmentManager());
viewPageAdapter.addFragment(info, "Player Info");
viewPageAdapter.addFragment(stats, "Current Stats");
viewPageAdapter.addFragment(ipl, "Whole Stats");

**And then set the viewpageradapter** 

   viewPager.setAdapter(viewPageAdapter);
    tabLayout.setupWithViewPager(viewPager);

您正在创建片段的新实例并对它们使用 setArguments,但从未使用过这些实例。