android - Android - 如何将数据从 Activity Adapter 发送到 TabLayout?
问题描述
我正在尝试将数据从适配器类发送到具有TabLayout
. 但我越来越NullPointerException
。我搜索了一些答案并使用了一个,但它对我不起作用。
这是代码
适配器类
@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);
}
});
}
具有 TabLayout 的 Activity 类
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);
}
}
标签布局片段
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
给片段的任何建议?
解决方案
您首先传递新片段,然后定义新片段并在它们上使用 setArguments 并且它们没有被使用。具体看这几行代码:
ViewPageAdapter viewPageAdapter = new ViewPageAdapter(getSupportFragmentManager());
viewPageAdapter.addFragment(new PlayerInfo(), "Player Info");
viewPageAdapter.addFragment(new CurrentStats(), "Current Stats");
viewPageAdapter.addFragment(new WholeIPL(), "Whole Stats");
在这里,您将新的 Fragments 传递给 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 下面并使用定义的片段。
推荐阅读
- video - 如何拦截来自 src='some server/video.mp4' 的请求
- java - NoSuchMethodException:对于 jdk1.8.0 中的 sun.misc.Launcher$AppClassLoader.addAppURL(java.net.URL)
- mysql - MySQL,根据 JSON 数组中的值选择记录
- c# - ObservableCollection 不保存在内置字典中
- ios - Json 无法将数据投射到我的模型中
- java - 从 Python 代码中排序算法 Java
- css - 元素和元素后代之间的引导模式背景 z-index
- javascript - 在 4 秒内循环浏览带有偏移的产品图像
- regex - 正则表达式 - 在行首或特定字符之后进行匹配的最有效表达式
- c# - 如何在带有 ASP.NET Core 的控制器中使用泛型方法