java - 将片段放入视图时自动创建新的数组列表
问题描述
我正在创建一个应用程序,用户可以在其中查看他们的分数历史记录,它工作正常,除了每当我直接单击片段时,都会使用以前的自定义项自动创建一个新的 arraylist 列表。当我使用保存按钮意图访问片段时,不会出现此类问题,并且 recyclerview 会按照我的意愿进行更新。
这就是我使用导航菜单项保存分数的方式
case R.id.save_game:
Intent save = new Intent(getApplicationContext(), ScoreActivity.class);
Bundle extras = new Bundle();
extras.putString("EXTRA_DATE", format);
save.putExtras(extras);
startActivity(save);
Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show();
break;
我在我的 ScoreFragment 中收到了意图
public void saveScore(){
Intent intent = requireActivity().getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
String format = extras.getString("EXTRA_DATE");
mScoreList.add(new ScoreItem(TeamAName, TeamBName, scoreTeamA, scoreTeamB, format));
saveData(); //Saves Arraylist to sharedpreferences
}
}
然后我调用saveScore()
我的 oncreateView 方法
我的分数片段像这样附加到 ScoreActivity
public class ScoreActivity extends AppCompatActivity {
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_category);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().replace(R.id.container,
new ScoreFragment()).commit();
}
}
}
我试过把我的saveScore()
方法onViewCreated()
也放进去onResume
,onSaveInstanceState
但它并没有改变任何东西。
在我的 ScoreActivity 中更改replace()
为也无济于事。add()
就在我给我的 rootView 充气后,我打电话给我loadData()
,我一直试图在其他地方调用它,但它会导致崩溃。
private void loadData() {
SharedPreferences sharedPreferences = requireActivity().getSharedPreferences("shared preferences", Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("task list", null);
Type type = new TypeToken<ArrayList<ScoreItem>>() {
}.getType();
mScoreList = gson.fromJson(json, type);
if (mScoreList == null) {
mScoreList = new ArrayList<>();
}
}
我该如何解决这个问题?
解决方案
getIntent()
总是返回你用来创建那个 Activity 的 Intent - 所以如果你使用那个菜单项来开始一个新的并添加额外的
Intent save = new Intent(getApplicationContext(), ScoreActivity.class);
Bundle extras = new Bundle();
extras.putString("EXTRA_DATE", format);
save.putExtras(extras);
startActivity(save);
那么当您调用getIntent
. 因此,如果您的片段中包含以下内容onViewCreated
:
Intent intent = requireActivity().getIntent();
Bundle extras = intent.getExtras();
并且它的父活动最初是使用 Intent+Extras 组合创建的,然后它将运行您的添加代码
老实说,这取决于您的应用程序的设置方式,因此我只能为您提供要查看的内容的想法
如果您有一个片段被交换的活动,那么
ScoreFragment
可以重新添加(您提到“使用导航抽屉导航到片段”)然后onViewCreated
将使用该 Intent 再次运行。如果它在屏幕外并且系统破坏了它的视图以节省内存,那么当它重新创建时,它将
onViewCreated
再次使用该 Intent 运行。如果您
startActivity
在不同的地方调用,但现有的 Activity 被重用(例如您的 Activity 作为singleTop 或 singleInstance启动),那么它将具有最初创建时使用的 Intent+Extras。因此,如果您首先通过带有附加功能的菜单项创建它,然后startActivity()
从其他地方不使用附加功能进行调用,如果原始活动被使用,它将仍然具有创建它时使用的 Intent+Extras。(它会通过接收新的意图,onNewIntent()
但不会改变 的值getIntent
)此外,您实际上并没有检查 extras Bundle 是否具有该
EXTRA_DATE
项目,只是它是否具有一些附加功能,然后您正在添加一个ScoreItem
带有任何extras.getString("EXTRA_DATE")
返回值的新项(可能是“null”)。因此,如果您在不同情况下与其他捆绑包一起启动,您可能仍会获得额外的分数
我知道这很多,这不是一个解决方案,但希望它有所帮助!老实说,我建议在 中设置断点saveScore
,调试应用程序并使用调试器查看getIntent
给你的信息,以及它是否正确。
推荐阅读
- r - 组差异条形图
- json - 有关 Chrome 扩展程序的常见问题解答
- javascript - 使 parseFromString() 解析而不进行验证
- php - 对于大多数语言字符集,如何正确保存和获取 MySql 的数据?
- flutter - 在多个数据爬网中需要一些帮助
- flutter - 在对话框中显示图像 - 返回类型 'Future
不是小部件 - reactjs - 在 React 中将嵌套的 json 数据转换为表格格式
- python - 从图像和相应的注释文件中录制视频
- python - 从txt文件解析json在python中不起作用
- javascript - 如何在javascript中比较两个对象并获得差异?