在 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<>();
应该够了。
我想在我的 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<>();
应该够了。