首页 > 解决方案 > 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++;
                }
            }
        });
    }

标签: javaandroid

解决方案


您可以创建一个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);

推荐阅读