Android FirebaseListAdapter项总是为一个int返回0
我有一个firebase数据库中的对象,它代表视频游戏中的角色,并包含他们的所有统计数据(攻击、防御、健康等)。我使用firebaseListAdapter用显示角色及其某些统计信息的自定义视图填充gridview 当使用Android API 25或更低版本时,这与预期一样有效,但使用API 26或更高版本时,除运行状况值之外的所有数据都可以正常运行,并且运行状况值始终设置为0 health变量只是一个int,在代码中的任何地方都不会与其他整数值(强度、防御等)有任何区别 我将注意到,将侦听器单独添加到任何字符的健康值中都可以很好地检索该值 有人知道这是什么原因吗Android FirebaseListAdapter项总是为一个int返回0,android,firebase,firebase-realtime-database,firebaseui,Android,Firebase,Firebase Realtime Database,Firebaseui,我有一个firebase数据库中的对象,它代表视频游戏中的角色,并包含他们的所有统计数据(攻击、防御、健康等)。我使用firebaseListAdapter用显示角色及其某些统计信息的自定义视图填充gridview 当使用Android API 25或更低版本时,这与预期一样有效,但使用API 26或更高版本时,除运行状况值之外的所有数据都可以正常运行,并且运行状况值始终设置为0 health变量只是一个int,在代码中的任何地方都不会与其他整数值(强度、防御等)有任何区别 我将注意到,将侦听器
FirebaseListOptions=newfirebaselistoptions.Builder()
.setQuery(mDatabase.child(“PlayerMonster”).child(firebaseId).orderByChild(“size”),PlayerMonster.class)
.setLayout(右布局。怪物网格单)
.build();
monsterFirebaseAdapter=新FirebaseListAdapter(选项){
@凌驾
受保护的void populateView(视图视图、PlayerMonster怪物实例、int位置){
//不只是获得健康值,最大健康值和其他一切都可以工作。查询健康本身也可以工作。
d(“怪物生命值是”+monsterInstance.getHealth()+”,最大生命值:“+monsterInstance.getMax_health());
//这里的代码填充视图
}
};
grid.setAdapter(FireBaseAdapter);
包odyssey.game.balfur.odyssey.firebase_对象;
导入android.os.packet;
导入android.os.Parcelable;
导入com.google.firebase.database.Exclude;
导入java.util.HashMap;
导入java.util.Map;
公共类PlayerMonster扩展了Monster实现Parcelable{
私有字符串用户\u给定\u nick\u名称;
私人int经验;
私人提款权;
私人机构;
受保护的PlayerMonster(包裹中){
user_given_nick_name=in.readString();
monster_name=in.readString();
itemHeldId=in.readInt();
type=in.readInt();
级别=in.readInt();
health=in.readInt();
max_health=in.readInt();
经验=in.readInt();
size=in.readInt();
skill1=in.readInt();
skill2=in.readInt();
skill3=in.readInt();
skill4=in.readInt();
强度=in.readInt();
防御=in.readInt();
magicStrength=in.readInt();
magicDefense=in.readInt();
速度=in.readInt();
skinId=in.readInt();
}
公共静态最终创建者=新创建者(){
@凌驾
public PlayerMonster createFromParcel(地块中){
返回新的PlayerMonster(in);
}
@凌驾
public PlayerMonster[]新数组(整数大小){
返回新的PlayerMonster[大小];
}
};
public int getDrawableRes(){返回drawableRes;}
public void setDrawableRes(int drawableRes){this.drawableRes=drawableRes;}
public int getExperience(){return experience;}
公共经验(int经验){this.experience=experience;}
//public void addExperience(int experience){this.experience+=experience;}
公共字符串getUser\u给定\u nick\u name(){
返回给定的用户名称;
}
public void setUser_given_nick_name(字符串user_given_nick_name){this.user_given_nick_name=user_given_nick_name;}
public int getItemHeldId(){return itemHeldId;}
public void setItemHeldId(int itemHeldId){this.itemHeldId=itemHeldId;}
公共字符串getMonsterStringName(){返回给定的用户名称;}
公共PlayerMonster(){}
public PlayerMonster(字符串userGivenNickName、字符串monsterName、int-itemHeldId、int-type、int-level、int-health、,
智力最大健康,智力经验,智力大小,智力技能1,智力技能2,智力技能3,智力技能4,
智力力量、智力防御、智力魔法力量、智力魔法防御、智力速度、智力皮肤ID){
this.user\u given\u nick\u name=userGivenNickName;
this.monster_name=monsterName;
this.itemHeldId=itemHeldId;
this.type=type;
这个水平=水平;
健康=健康;
this.max\u health=max\u health;
经验=经验;
这个。大小=大小;
this.skill1=skill1;
this.skill2=skill2;
this.skill3=skill3;
this.skill4=skill4;
力量=力量;
这个。防御=防御;
this.magicStrength=magicStrength;
this.magicDefense=magicDefense;
速度=速度;
this.skinId=skinId;
}
//带图像资源的怪物构造器。用于monsterBattleGridAdapter
public PlayerMonster(字符串userGivenNickName、字符串monsterName、int-itemHeldId、int-type、int-level、int-health、,
int max_健康、int经验、int大小、int绘图能力、int技能1、int技能2、int技能3、int技能4、,
智力力量、智力防御、智力魔法力量、智力魔法防御、智力速度、智力皮肤ID){
this.user\u given\u nick\u name=userGivenNickName;
this.monster_name=monsterName;
this.itemHeldId=itemHeldId;
this.type=type;
这个水平=水平;
健康=健康;
this.max\u health=max\u health;
经验=经验;
这个。大小=大小;
this.drawableRes=drawableRes;
this.skill1=skill1;
this.skill2=skill2;
this.skill3=skill3;
this.skill4=skill4;
力量=力量;
这个。防御=防御;
this.magicStrength=magicStrength;
this.magicDefense=magicDefense;
速度=速度;
this.skinId=sk
FirebaseListOptions<PlayerMonster> options = new FirebaseListOptions.Builder<PlayerMonster>()
.setQuery(mDatabase.child("playerMonsters").child(firebaseId).orderByChild("size"), PlayerMonster.class)
.setLayout(R.layout.monster_grid_single)
.build();
monsterFirebaseAdapter = new FirebaseListAdapter<PlayerMonster>(options) {
@Override
protected void populateView(View view, PlayerMonster monsterInstance, int position) {
// Not getting value for health ONLY, max health and everything else works. Querying health by itself also works.
Timber.d("monster health is " + monsterInstance.getHealth() + ", max hp: " + monsterInstance.getMax_health());
// Code here populates the view
}
};
grid.setAdapter(monsterFirebaseAdapter);
package odyssey.game.balfur.odyssey.firebase_objects;
import android.os.Parcel;
import android.os.Parcelable;
import com.google.firebase.database.Exclude;
import java.util.HashMap;
import java.util.Map;
public class PlayerMonster extends Monster implements Parcelable {
private String user_given_nick_name;
private int experience;
private int drawableRes;
private int itemHeldId;
protected PlayerMonster(Parcel in) {
user_given_nick_name = in.readString();
monster_name = in.readString();
itemHeldId = in.readInt();
type = in.readInt();
level = in.readInt();
health = in.readInt();
max_health = in.readInt();
experience = in.readInt();
size = in.readInt();
skill1 = in.readInt();
skill2 = in.readInt();
skill3 = in.readInt();
skill4 = in.readInt();
strength = in.readInt();
defense = in.readInt();
magicStrength = in.readInt();
magicDefense = in.readInt();
speed = in.readInt();
skinId = in.readInt();
}
public static final Creator<PlayerMonster> CREATOR = new Creator<PlayerMonster>() {
@Override
public PlayerMonster createFromParcel(Parcel in) {
return new PlayerMonster(in);
}
@Override
public PlayerMonster[] newArray(int size) {
return new PlayerMonster[size];
}
};
public int getDrawableRes() {return drawableRes;}
public void setDrawableRes(int drawableRes) {this.drawableRes = drawableRes;}
public int getExperience() {return experience;}
public void setExperience(int experience) {this.experience = experience; }
// public void addExperience(int experience) {this.experience += experience; }
public String getUser_given_nick_name() {
return user_given_nick_name;
}
public void setUser_given_nick_name(String user_given_nick_name) {this.user_given_nick_name = user_given_nick_name;}
public int getItemHeldId() {return itemHeldId;}
public void setItemHeldId(int itemHeldId) {this.itemHeldId = itemHeldId;}
public String getMonsterStringName(){ return user_given_nick_name; }
public PlayerMonster(){}
public PlayerMonster(String userGivenNickName, String monsterName, int itemHeldId, int type, int level, int health,
int max_health, int experience, int size, int skill1, int skill2, int skill3, int skill4,
int strength, int defense, int magicStrength, int magicDefense, int speed, int skinId){
this.user_given_nick_name = userGivenNickName;
this.monster_name = monsterName;
this.itemHeldId = itemHeldId;
this.type = type;
this.level = level;
this.health = health;
this.max_health = max_health;
this.experience = experience;
this.size = size;
this.skill1 = skill1;
this.skill2 = skill2;
this.skill3 = skill3;
this.skill4 = skill4;
this.strength = strength;
this.defense = defense;
this.magicStrength = magicStrength;
this.magicDefense = magicDefense;
this.speed = speed;
this.skinId = skinId;
}
// constructor for monsters w/ image resource. for use in the monsterBattleGridAdapter
public PlayerMonster(String userGivenNickName, String monsterName, int itemHeldId, int type, int level, int health,
int max_health, int experience, int size, int drawableRes, int skill1, int skill2, int skill3, int skill4,
int strength, int defense, int magicStrength, int magicDefense, int speed, int skinId){
this.user_given_nick_name = userGivenNickName;
this.monster_name = monsterName;
this.itemHeldId = itemHeldId;
this.type = type;
this.level = level;
this.health = health;
this.max_health = max_health;
this.experience = experience;
this.size = size;
this.drawableRes = drawableRes;
this.skill1 = skill1;
this.skill2 = skill2;
this.skill3 = skill3;
this.skill4 = skill4;
this.strength = strength;
this.defense = defense;
this.magicStrength = magicStrength;
this.magicDefense = magicDefense;
this.speed = speed;
this.skinId = skinId;
}
@Exclude
public Map<String, Object> toMap() {
HashMap<String, Object> result = new HashMap<>();
result.put("user_given_nick_name", user_given_nick_name);
result.put("monster_name", monster_name);
result.put("itemHeldId", itemHeldId);
result.put("type", type);
result.put("level", level);
result.put("health", health);
result.put("max_health", max_health);
result.put("experience", experience);
result.put("size", size);
result.put("skill1", skill1);
result.put("skill2", skill2);
result.put("skill3", skill3);
result.put("skill4", skill4);
result.put("strength", strength);
result.put("defense", defense);
result.put("magicStrength", magicStrength);
result.put("magicDefense", magicDefense);
result.put("speed", speed);
result.put("skinId", skinId);
return result;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(user_given_nick_name);
parcel.writeString(monster_name);
parcel.writeInt(itemHeldId);
parcel.writeInt(type);
parcel.writeInt(level);
parcel.writeInt(health);
parcel.writeInt(max_health);
parcel.writeInt(experience);
parcel.writeInt(size);
parcel.writeInt(skill1);
parcel.writeInt(skill2);
parcel.writeInt(skill3);
parcel.writeInt(skill4);
parcel.writeInt(strength);
parcel.writeInt(defense);
parcel.writeInt(magicStrength);
parcel.writeInt(magicDefense);
parcel.writeInt(speed);
parcel.writeInt(skinId);
}
}
package odyssey.game.balfur.odyssey.firebase_objects;
import android.os.Parcel;
import android.os.Parcelable;
import odyssey.game.balfur.odyssey.helpers.Condition;
import odyssey.game.balfur.odyssey.helpers.Helpers;
import odyssey.game.balfur.odyssey.helpers.TalentShorthand;
import java.util.HashMap;
import timber.log.Timber;
public class Monster implements Parcelable {
String monster_name;
int type;
int skill1;
int skill2;
int skill3;
int skill4;
int max_health;
int health;
int shield = 0;
int strength;
int speed;
int defense;
int magicStrength;
int magicDefense;
private boolean canSwap = true;
int skinId; // Each separate skin for each monster will have an ID associated with it
String firebaseId;
// At start of battle, record monsters stats to make sure buffs stay below certain %
public int[] baseStats = new int[6];
// Used to record how many stacks of a buff a monster has. can have between -5 and 5, each
// Representing 8% change from base stats. All values initialize to 0 by default
public int[] buffStacks = new int[6];
private HashMap<Integer, Condition> currentConditions = new HashMap<>();
private HashMap<Object, TalentShorthand> talentShorthand= new HashMap<>();
int level;
int size;
protected Monster(Parcel in) {
monster_name = in.readString();
type = in.readInt();
skill1 = in.readInt();
skill2 = in.readInt();
skill3 = in.readInt();
skill4 = in.readInt();
max_health = in.readInt();
health = in.readInt();
shield = in.readInt();
strength = in.readInt();
speed = in.readInt();
defense = in.readInt();
magicStrength = in.readInt();
magicDefense = in.readInt();
canSwap = in.readByte() != 0;
skinId = in.readInt();
firebaseId = in.readString();
baseStats = in.createIntArray();
buffStacks = in.createIntArray();
level = in.readInt();
size = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(monster_name);
dest.writeInt(type);
dest.writeInt(skill1);
dest.writeInt(skill2);
dest.writeInt(skill3);
dest.writeInt(skill4);
dest.writeInt(max_health);
dest.writeInt(health);
dest.writeInt(shield);
dest.writeInt(strength);
dest.writeInt(speed);
dest.writeInt(defense);
dest.writeInt(magicStrength);
dest.writeInt(magicDefense);
dest.writeByte((byte) (canSwap ? 1 : 0));
dest.writeInt(skinId);
dest.writeString(firebaseId);
dest.writeIntArray(baseStats);
dest.writeIntArray(buffStacks);
dest.writeInt(level);
dest.writeInt(size);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Monster> CREATOR = new Creator<Monster>() {
@Override
public Monster createFromParcel(Parcel in) {
return new Monster(in);
}
@Override
public Monster[] newArray(int size) {
return new Monster[size];
}
};
// At start of battle, need to copy an array of each monsters stats and store it in each monster object
// These values will be checked when buff skills are used to ensure monsters stats do not go over the max buff amount (currently 40% over base)
public void backupStats(){
Timber.d("Backing up stats for %s", monster_name);
baseStats[0] = strength;
baseStats[1] = defense;
baseStats[2] = magicStrength;
baseStats[3] = magicDefense;
baseStats[4] = speed;
baseStats[5] = max_health;
}
public Monster(){}
public Monster(int level, String monster_name, int skinId){
this.level = level;
this.monster_name = monster_name;
this.skinId = skinId;
}
public int[] getBaseStats() { return baseStats; }
public void setBaseStats(int[] baseStats) { this.baseStats = baseStats; }
public String getFirebaseId() {return firebaseId;}
public void setFirebaseId(String firebaseId) {this.firebaseId = firebaseId;}
public int getSpeed() {return speed;}
public void setSpeed(int speed) {this.speed = speed;}
public int getStrength() {return strength;}
public void setStrength(int strength) {this.strength = strength;}
public int getDefense() {return defense;}
public void setDefense(int defense) {this.defense = defense;}
public int getMagicStrength() {return magicStrength;}
public void setMagicStrength(int magicStrength) {this.magicStrength = magicStrength;}
public int getMagicDefense() {return magicDefense;}
public void setMagicDefense(int magicDefense) {this.magicDefense = magicDefense;}
public int getSkill2() {return skill2;}
public void setSkill2(int skill2) {this.skill2 = skill2;}
public int getSkill3() {return skill3;}
public void setSkill3(int skill3) {this.skill3 = skill3;}
public int getSkill1() {return skill1;}
public void setSkill1(int skill1) {this.skill1 = skill1;}
public int getSkill4() {return skill4;}
public void setSkill4(int skill4) {this.skill4 = skill4;}
public int getSize() {return size;}
public void setSize(int size) {this.size = size;}
public int getMax_health() {
return max_health;
}
public void setMax_health(int max_health) {
this.max_health = max_health;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
if (health > max_health) this.health = max_health;
else if (health <= 0) this.health = 0;
else this.health = health;
}
public int getShield() {return shield;}
public void setShield(int shield) {
if (shield > max_health) this.shield = max_health;
else if (shield <= 0) this.shield = 0;
else this.shield = shield;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getMonster_name() {
return monster_name;
}
public void setMonster_name(String monster_name) {
this.monster_name = monster_name;
}
public String getMonsterStringName(){ return monster_name; }
public int getSkinId() { return skinId; }
public void setSkinId(int skinId) { this.skinId = skinId; }
public boolean isCanSwap() { return canSwap; }
public void setCanSwap(boolean canSwap) { this.canSwap = canSwap; }
public HashMap<Object, TalentShorthand> getTalentShorthand(){
return talentShorthand;
}
public void setTalentShorthand(HashMap<Object, TalentShorthand> talentShorthand){this.talentShorthand = talentShorthand;}
public HashMap<Integer, Condition> getCurrentConditions(){
return currentConditions;
}
public void setCurrentConditions(HashMap<Integer, Condition> currentConditions){this.currentConditions = currentConditions;}
public void addCondition(int conditionId, int roundsRemaining, double conditionDamagePercent, int addedStacks){
Condition condition;
if (currentConditions.containsKey(conditionId)){
int conditionStacks = currentConditions.get(conditionId).getConditionStacks();
// If adding one to the current stacks would still be less than the max stacks for that condition, add 1, otherwise do nothing
if (conditionStacks + addedStacks > Helpers.getConditionMaxStacks(conditionId)){
conditionStacks = Helpers.getConditionMaxStacks(conditionId);
addedStacks = Helpers.getConditionMaxStacks(conditionId) - conditionStacks; // The difference between the max and the preexisting conditions will be the true number of stacks added
} else {
conditionStacks += addedStacks;
}
condition = new Condition(roundsRemaining, conditionDamagePercent, conditionStacks);
condition.setStacksAppliedThisRound(addedStacks);
currentConditions.put(conditionId, condition);
} else {
condition = new Condition(roundsRemaining, conditionDamagePercent, addedStacks);
condition.setStacksAppliedThisRound(addedStacks);
currentConditions.put(conditionId, condition);
}
}
public void removeCondition(int conditionId){ // Used for calling condition remove skills doi
if (currentConditions.containsKey(conditionId)){
currentConditions.remove(conditionId);
}
}
}
public void setHealth(int health) {
if (health > max_health) this.health = max_health;
else if (health <= 0) this.health = 0;
else this.health = health;
}
if (health > max_health)