как оптимизировать if-else заявление андроид студии - PullRequest
0 голосов
/ 12 декабря 2018

В приложении для Android у меня есть 2 действия.MainActivity - это список баскетболистов (17 игроков) и PlayerDetailActivity с их именем, возрастом, ростом, положением и изображениями.Как уменьшить использование оператора if-else?Я знаю, что лучше создать класс Player со всеми его атрибутами, но я застрял.

Вот мой код MainActivity

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

String[] bostonCeltics = new String[] {"Kyrie Irving", "Jayson Tatum", "Gordon Hayward", "Robert Williams", "Jabari Bird", "Al Horford", "Jaylen Brown", "Marcus Smart", "Terry Rozier", "Aron Baynes", "Marcus Morris", "Brad Wanamaker", "P.J.Dozier", "Daniel Theis", "Guerschon Yabusele", "Semi Ojeleye", "Walter Lemon, Jr"};

ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = (ListView) findViewById(R.id.listView);

    ArrayAdapter<String> bostonCelticsAdapter = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, bostonCeltics);

    listView.setAdapter(bostonCelticsAdapter);

    listView.setOnItemClickListener(this);

}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    Intent moveToDetailIntent = new Intent(getBaseContext(), PlayerDetailActivity.class);
    moveToDetailIntent.putExtra("playerName", bostonCeltics[position]);
    startActivity(moveToDetailIntent);
}

}

Вот мой код PlayerDetailActivity

открытый класс PlayerDetailActivity расширяет AppCompatActivity {

TextView nameTextView;
TextView ageTextView;
TextView heightTextView;
TextView positionTextView;
ImageView imageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_player_detail);

    nameTextView = (TextView) findViewById(R.id.nameTextView);
    ageTextView = (TextView) findViewById(R.id.ageTextView);
    heightTextView = (TextView) findViewById(R.id.heightTextView);
    positionTextView = (TextView) findViewById(R.id.positionTextView);
    imageView = (ImageView) findViewById(R.id.imageView);

// Имя игрока

    String playerName = (String) getIntent().getExtras().get("playerName");
    nameTextView.setText(playerName);

// Возраст игрока

    if (playerName.equals("Kyrie Irving")) {
        ageTextView.setText("Birth date: 23-Mar-92");
    }
    if (playerName.equals("Jayson Tatum")) {
        ageTextView.setText("Birth date: 3-Mar-98");
    }
    if (playerName.equals("Gordon Hayward")) {
        ageTextView.setText("Birth date: 23-Mar-90");
    }

...

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Самым простым непосредственным предложением было бы создать карту имен игроков с датами рождения:

Map<String, String> players = new HashMap<>();
map.put("Kyrie Irving", "Birth date: 23-Mar-92");
map.put("Jayson Tatum", "Birth date: 3-Mar-98");
map.put("Gordon Hayward", "Birth date: 23-Mar-90");
// and so on

Затем использовать карту в своей деятельности:

ageTextView = (TextView) findViewById(R.id.ageTextView);
String date = players.get(playerName) != null ? players.get(playerName) : "NA";
ageTextView.setText(date);

В идеале, вы бы не сталиТрудно кодировать так много данных.Возможно, вы могли бы загрузить из базы данных или файла.

0 голосов
/ 12 декабря 2018

Вы можете полностью заменить операторы if и операторы switch, используя объектную ориентацию.

Это позволит вам использовать следующий код, который намного чище.Это также более динамично и расширяемо, если вы хотите использовать источник данных в будущем.

// In the PlayerDetailActivity
Player player = (Player) getIntent().getExtras().get("player");
nameTextView.setText(player.getName());
ageTextView.setText("Birth date: " + player.getBirthDate());

Вам необходимо заменить массив bostonCeltics на ArrayList, как показано ниже, в вашей MainActivity.

// Global variable
List<Player> bostonCeltics= new ArrayList<>();

// In your onCreate()
bostonCeltics.add(new Player("Kyrie Irving", "23-Mar-92"));
bostonCeltics.add(new Player("Jayson Tatum", "3-Mar-98"));
bostonCeltics.add(new Player("Gordon Hayward", "23-Mar-90"));

// When creating your intent
moveToDetailIntent.putExtra("player", bostonCeltics.get(position));

Ниже приведен пример того, как вы можете создать класс Player.Поместите его в отдельный файл.

// Implementing Serializable allows the object to be passed in intents between activities.
public class Player implements Serializable { 
    private String name;
    private String birthDate;

    // Constructor
    public Player(String name, String birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }

    // Below is just Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(String birthDate) {
        this.birthDate = birthDate;
    }
}

Для дальнейшего чтения об объектах и ​​классах, я рекомендую этот учебник .Вы найдете других, если будете искать «как создать класс в Java».

0 голосов
/ 12 декабря 2018

Вы должны использовать операторы switch

    switch (playerName){
        case "Kyrie Irvin":
        ...
            break;
        case "Jayson Tatum":
            ...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...