Использование глобальных переменных в адаптере Android Studio - PullRequest
0 голосов
/ 06 августа 2020

Я хочу использовать свой класс GlobalState в моем HomePlayerAdapter. Когда я нажимаю Switch в моем ListView, они должны сохранить идентификатор из моего объекта игрока в GlobalState. Но когда я нажимаю Switch, мое приложение разбилось.

Здесь мой класс GlobalState:

public class GlobalState extends Application {

    private ArrayList<Integer> selectedPlayer;


    public ArrayList<Integer> getSelectedPlayer() {
        return selectedPlayer;
    }

    public void addSelectedPlayer(int p) {
        this.selectedPlayer.add(p);
    }

    public void removeSelectedPlayer(int p) {
        this.selectedPlayer.remove(p);
    }
}

Здесь мой класс HomePlayerAdapter:

public class HomePlayerAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<Player> items;

   private GlobalState globalState;


    public HomePlayerAdapter(Context context, ArrayList<Player> items){

        this.context = context;
        this.items = items;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null){
            convertView = LayoutInflater.from(context).inflate(R.layout.home_player_list_item, parent, false);
        }

        globalState = (GlobalState) context.getApplicationContext();

        final Player currentItem = (Player) getItem(position);

        TextView playerName = (TextView) convertView.findViewById(R.id.PlayerItemTextView);
        SwitchMaterial deckSwitch = (SwitchMaterial) convertView.findViewById(R.id.PlayerItemSwitch);

        playerName.setText(currentItem.getName());

        deckSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {

            if (isChecked){

                globalState.addSelectedPlayer(currentItem.getId());

            }if (!isChecked){

                globalState.removeSelectedPlayer(currentItem.getId());

            }

        });

        return convertView;
    }

    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

}

Когда я нажимаю на Switch, они вызывают: deckSwitch.setOnCheckedChangeListener и проверяют, установлен ли swith или нет. Когда он отмечен, он должен сохранить идентификатор от выбранного игрока в классе GlobalState, а когда он не проверен, он должен удалить идентификатор.

1 Ответ

0 голосов
/ 06 августа 2020

Я не знаю, делали ли вы это где-то еще в своем коде, но проблема в предоставленном вами фрагменте кода заключается в том, что вы на самом деле не создали Arraylist 'selectedPlayer'. Это можно проверить, если вы получаете исключение nullPointerException.

хотя, я бы посоветовал вместо создания класса globalState, подобного этому, создать класс, который будет содержать независимую от контекста информацию, и объявить переменные-члены stati c , и методы. Так что вам не нужно создавать экземпляр класса для использования. Поскольку вы в любом случае собираетесь использовать selectedPlayer как глобальную переменную, лучше сделать его stati c, чтобы предотвратить дублирование экземпляров.

Что касается решения вашей проблемы для этого конкретного случая, просто выполните

 private ArrayList<Integer> selectedPlayer = new ArrayList<>();

должно хватить.

...