java - Java:在刷新其编号之前保存 Activity 及其 RecyclerView 的状态
问题描述
我有这个圆盘高尔夫应用程序,它可以计算玩家在某个洞的投掷次数。每个洞都有自己的标准杆号码。每次用户“去下一个洞”(点击箭头按钮)而不是实际意图到新的 Activity 时,这个 Activity 都会刷新同一个 Activity 的新编号(根据哪个洞编号)。
默认情况下,每次用户换洞时,玩家的投掷号码(绿色背景号码)必须与 Par: X, x 号码匹配。目前我的代码就是这样做的......但是,当用户更改玩家投掷数字(加号和减号)时,它不会保存用户设置的那些数字。我的意思是,如果用户在 1/18 洞,并且设置为玩家 1 投 5 球,玩家 2 投 4,然后用户进入 2/18 洞并再次回到 1/18 洞, 1/18 洞的数字 5 和 4 没有保存,而是保存了之前的数字(默认)。
所以现在我需要根据孔号来保存号码,这怎么可能,这甚至可以用我现在的代码来实现,如果没有,我应该怎么做?
任务:
public class ActivityGame extends AppCompatActivity {
HashMap<Integer, ArrayList> parMap = new HashMap<>();
int parNum = 0;
创建时:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
updateDataSet();
setLayoutData();
setButtons();
buildRecyclerView();
更新数据集:
private void updateDataSet() {
mParNm = findViewById(R.id.gameParNumber);
parNum = Integer
.parseInt(getIntent().getStringArrayListExtra("PARNUMBERSINDIVIDUALLY").get(holeCounter - 1));
if (parMap.containsKey(parNum)) {
mGameItemList = parMap.get(parNum); // your Items list for the specific Par
} else {
for (int i = 0; i < ActivityNewGame.mCheckedBoxes.size(); i++) {
mGameItemList = new ArrayList<>();
mGameItemList.add(
new GameItem(ActivityNewGame.mCheckedBoxes.get(i), mParNm.getText().toString(),
R.drawable.ic_minus, R.drawable.ic_plus, "TTL :", "0"));
parMap.put(parNum, mGameItemList);
}
}
}
构建回收站视图:
private void buildRecyclerView() {
mParNm = findViewById(R.id.gameParNumber);
mRecyclerView = findViewById(R.id.gameRecyclerView);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this);
mAdapter = new GameAdapter(mGameItemList);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
/** Set buttons logic **/
mAdapter.setOnItemClickListener(new GameAdapter.OnItemClickListener() {
/** When player click minus button **/
@Override
public void onMinusClick(int position) {
/** Take player par number **/
String parNum = mGameItemList.get(position).getText2();
int intParNm = Integer.valueOf(parNum);
if (intParNm != 1) {
/** Change that number to new number **/
intParNm -= 1;
/** Set changed par number to the particular player (where button is clicked) **/
mGameItemList.get(position).changeText2(Integer.toString(intParNm));
mAdapter.notifyDataSetChanged();
}
}
/** When player click plus button **/
@Override
public void onPlusClick(int position) {
/** Take player par number **/
String parNum = mGameItemList.get(position).getText2();
int intParNm = Integer.valueOf(parNum);
if (intParNm != 99) {
/** Change that number to new number **/
intParNm += 1;
/** Set changed par number to the particular player (where button is clicked) **/
mGameItemList.get(position).changeText2(Integer.toString(intParNm));
mAdapter.notifyDataSetChanged();
}
}
});
}
箭头按钮的逻辑(换孔):
private void setButtons() {
mBackArrow = findViewById(R.id.previous);
mForwardArrow = findViewById(R.id.next);
Intent intent = getIntent();
mParNm = findViewById(R.id.gameParNumber);
mParNm.setText(intent.getStringArrayListExtra("PARNUMBERSINDIVIDUALLY").get(holeCounter - 1));
/** Arrow Left Button **/
mBackArrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mHoleNm = findViewById(R.id.gameHoleNumber);
if (holeCounter > 1) {
mForwardArrow.setImageResource(R.drawable.ic_arrow_right);
/** Set previous hole number **/
holeCounter--;
/** Set Hole number X/X **/
Intent intent = getIntent();
mHoleNm.setText(holeCounter + "/" + intent.getStringExtra("HOLESNM"));
/** Set par number (Par: X) according to the hole number **/
mParNm = findViewById(R.id.gameParNumber);
mParNm.setText(intent.getStringArrayListExtra("PARNUMBERSINDIVIDUALLY").get(holeCounter - 1));
/** Display changes **/
updateGameArrayList(Integer.parseInt(mParNm.getText().toString()));
parNum--;
}
}
});
/** Arrow Right Button **/
mForwardArrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mHoleNm = findViewById(R.id.gameHoleNumber);
Intent intent = getIntent();
int holesNm = Integer.parseInt(intent.getStringExtra("HOLESNM"));
if (holeCounter == holesNm - 1) {
mForwardArrow.setImageResource(R.drawable.ic_finish);
/** Set next hole number **/
holeCounter++;
/** Set Hole number X/X **/
mHoleNm.setText(holeCounter + "/" + intent.getStringExtra("HOLESNM"));
/** Set par number (Par: X) according to the hole number **/
mParNm = findViewById(R.id.gameParNumber);
mParNm.setText(intent.getStringArrayListExtra("PARNUMBERSINDIVIDUALLY").get(holeCounter - 1));
/** Display changes **/
updateGameArrayList(Integer.parseInt(mParNm.getText().toString()));
parNum++;
} else if (holeCounter < holesNm) {
mForwardArrow.setImageResource(R.drawable.ic_arrow_right);
/** Set next hole number **/
holeCounter++;
/** Set Hole number X/X **/
mHoleNm.setText(holeCounter + "/" + intent.getStringExtra("HOLESNM"));
/** Set par number (Par: X) according to the hole number **/
mParNm = findViewById(R.id.gameParNumber);
mParNm.setText(intent.getStringArrayListExtra("PARNUMBERSINDIVIDUALLY").get(holeCounter - 1));
/** Display changes **/
updateGameArrayList(Integer.parseInt(mParNm.getText().toString()));
parNum++;
}
}
});
}
解决方案
您可以创建一个HashMap
来保存您GameItemList
的 Map 密钥所在的位置Par
。根据 Par 号码加载屏幕。此外,您mGameItemList
将从 parNum 中检索:
全局变量:
HashMap<Integer, ArrayList<GameItem>> parMap = new HashMap<>();
ArrayList<GameItem> mGameItemList = new ArrayList<GameItem>();
int parNum = 0;
创建:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
updateDataSet();
setLayoutData();
setButtons();
buildRecyclerView();
}
更新数据集
private void updateDataSet() {
parNum = Integer
.parseInt(getIntent().getStringArrayListExtra("PARNUMBERSINDIVIDUALLY").get(holeCounter - 1));
if (parMap.containsKey(parNum)) {
mGameItemList = parMap.get(parNum); // your Items list for the specific Par
} else {
for (int i = 0; i < ActivityNewGame.mCheckedBoxes.size(); i++) {
mGameItemList = new ArrayList<GameItem>();
mGameItemList.add(
new GameItem(ActivityNewGame.mCheckedBoxes.get(i), mParNm.getText().toString(),
R.drawable.ic_minus, R.drawable.ic_plus, "TTL :", "0"));
parMap.put(parNum, mGameItemList);
}
}
}
设置按钮:
private void setButtons() {
mBackArrow = findViewById(R.id.previous);
mForwardArrow = findViewById(R.id.next);
Intent intent = getIntent();
mParNm = findViewById(R.id.gameParNumber);
mParNm.setText(""+parNum);
/** Arrow Left Button **/
mBackArrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mHoleNm = findViewById(R.id.gameHoleNumber);
if (holeCounter > 1) {
mForwardArrow.setImageResource(R.drawable.ic_arrow_right);
/** Set previous hole number **/
holeCounter--;
/** Set Hole number X/X **/
Intent intent = getIntent();
mHoleNm.setText(holeCounter + "/" + intent.getStringExtra("HOLESNM"));
/** Set par number (Par: X) according to the hole number **/
mParNm = findViewById(R.id.gameParNumber);
updateDataSet();
mParNm.setText(""+parNum);
/** Display changes **/
updateGameArrayList(Integer.parseInt(mParNm.getText().toString()));
parNum--;
}
}
});
/** Arrow Right Button **/
mForwardArrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mHoleNm = findViewById(R.id.gameHoleNumber);
Intent intent = getIntent();
int holesNm = Integer.parseInt(intent.getStringExtra("HOLESNM"));
if (holeCounter == holesNm - 1) {
mForwardArrow.setImageResource(R.drawable.ic_finish);
/** Set next hole number **/
holeCounter++;
/** Set Hole number X/X **/
mHoleNm.setText(holeCounter + "/" + intent.getStringExtra("HOLESNM"));
/** Set par number (Par: X) according to the hole number **/
mParNm = findViewById(R.id.gameParNumber);
updateDataSet();
mParNm.setText(""+parNum);
/** Display changes **/
updateGameArrayList(Integer.parseInt(mParNm.getText().toString()));
parNum++;
} else if (holeCounter < holesNm) {
mForwardArrow.setImageResource(R.drawable.ic_arrow_right);
/** Set next hole number **/
holeCounter++;
/** Set Hole number X/X **/
mHoleNm.setText(holeCounter + "/" + intent.getStringExtra("HOLESNM"));
/** Set par number (Par: X) according to the hole number **/
mParNm = findViewById(R.id.gameParNumber);
updateDataSet();
mParNm.setText(""+parNum);
/** Display changes **/
updateGameArrayList(Integer.parseInt(mParNm.getText().toString()));
parNum++;
}
}
});
}
buildRecyclerView:
private void buildRecyclerView() {
mParNm = findViewById(R.id.gameParNumber);
mRecyclerView = findViewById(R.id.gameRecyclerView);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this);
mAdapter = new GameAdapter(mGameList);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
推荐阅读
- abap - 如何生成两个内部表的笛卡尔积?
- javascript - 如何获取单个数组中差异最大的元素?
- apache-spark - 即使在增加 spark.driver.memory 之后,PySpark 也会超出 Java 堆空间
- html - 我可以从 md 文件生成相互引用的 html 页面吗
- swift - SwiftUI:可以从任何视图触发的全局叠加层
- c# - 如何在 ajax 错误回调中为 errorThrown 参数设置自定义消息?
- python-3.x - 如何使用需要密码的证书使用 Web 服务肥皂?
- django - 接受多个值的端点,包括查询字符串
- javascript - 使用 keydown 处理程序控制焦点时,焦点轮廓在 Chrome 中不可见
- mysql - 如何在 partition by 子句上解决以下 mysql 查询。我相信我正确地使用了这些条款