在 Adapter Android Studio 中使用全局变量

Use global variables in an Adaptor Android Studio

我想在我的 HomePlayerAdapter 中使用我的 class GlobalState。当我在我的 ListView 中单击一个 Switch 时,他们应该将我的播放器对象的 ID 保存在 GlobalState 中。但是当我点击一个开关时,我的应用程序崩溃了。

这是我的 GlobalState class:

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 class:

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;
    }

}

当我点击开关时,他们会调用:deckSwitch.setOnCheckedChangeListener 并检查开关是否被选中。当它被选中时,它应该将所选玩家的 ID 保存在 GlobalState class 中,当它未被选中时,它应该删除该 ID。

我不知道你是否在你的代码的其他地方做了这个,但是你提供的代码片段,问题在于你实际上没有创建 'selectedPlayer' Arraylist。可以检查您是否收到 nullPointerException。

不过,我建议不要像这样创建一个 globalState class,而是创建一个 class 来保存与上下文无关的信息,并声明静态成员变量和方法。这样您就不必实例化 class 来使用。由于无论如何都要将 selectedPlayer 用作全局变量,因此最好将其设为静态,以防止重复实例化。

至于您针对这个特殊情况的问题的解决方案,只需执行

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

应该够了。