From 918751dd3e915b6557c7fbf546cd79a00405d44f Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Sun, 27 Jun 2021 00:17:16 -0700 Subject: [PATCH] Refactors monster detail to use a view holder and partially corrects Regional Actions to Regional Effects. --- .../ui/monster/MonsterDetailFragment.java | 184 ++++++------ .../main/res/layout/fragment_edit_monster.xml | 2 +- app/src/main/res/layout/fragment_monster.xml | 279 ++++++++++++++---- app/src/main/res/values/strings.xml | 3 +- 4 files changed, 328 insertions(+), 140 deletions(-) diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java index c9288fb..0301d29 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterDetailFragment.java @@ -34,6 +34,7 @@ import java.util.UUID; import io.reactivex.rxjava3.observers.DisposableSingleObserver; public class MonsterDetailFragment extends MCFragment { + private ViewHolder mHolder; private MonsterDetailViewModel monsterDetailViewModel; @@ -48,6 +49,8 @@ public class MonsterDetailFragment extends MCFragment { monsterDetailViewModel = new ViewModelProvider(this).get(MonsterDetailViewModel.class); View root = inflater.inflate(R.layout.fragment_monster, container, false); + mHolder = new ViewHolder(root); + repository.getMonster(monsterId).toObservable() .firstOrError() .subscribe(new DisposableSingleObserver() { @@ -64,123 +67,82 @@ public class MonsterDetailFragment extends MCFragment { } }); - final TextView monsterName = root.findViewById(R.id.name); - monsterDetailViewModel.getName().observe(getViewLifecycleOwner(), monsterName::setText); - - final TextView monsterMeta = root.findViewById(R.id.meta); - monsterDetailViewModel.getMeta().observe(getViewLifecycleOwner(), monsterMeta::setText); - - final TextView monsterArmorClass = root.findViewById(R.id.armor_class); - monsterDetailViewModel.getArmorClass().observe(getViewLifecycleOwner(), armorText -> monsterArmorClass.setText(Html.fromHtml("Armor Class " + armorText))); - - final TextView monsterHitPoints = root.findViewById(R.id.hit_points); - monsterDetailViewModel.getHitPoints().observe(getViewLifecycleOwner(), hitPoints -> monsterHitPoints.setText(Html.fromHtml("Hit Points " + hitPoints))); - - final TextView monsterSpeed = root.findViewById(R.id.speed); - monsterDetailViewModel.getSpeed().observe(getViewLifecycleOwner(), speed -> monsterSpeed.setText(Html.fromHtml("Speed " + speed))); - - final TextView monsterStrength = root.findViewById(R.id.strength); - monsterDetailViewModel.getStrength().observe(getViewLifecycleOwner(), monsterStrength::setText); - - final TextView monsterDexterity = root.findViewById(R.id.dexterity); - monsterDetailViewModel.getDexterity().observe(getViewLifecycleOwner(), monsterDexterity::setText); - - final TextView monsterConstitution = root.findViewById(R.id.constitution); - monsterDetailViewModel.getConstitution().observe(getViewLifecycleOwner(), monsterConstitution::setText); - - final TextView monsterIntelligence = root.findViewById(R.id.intelligence); - monsterDetailViewModel.getIntelligence().observe(getViewLifecycleOwner(), monsterIntelligence::setText); - - final TextView monsterWisdom = root.findViewById(R.id.wisdom); - monsterDetailViewModel.getWisdom().observe(getViewLifecycleOwner(), monsterWisdom::setText); - - final TextView monsterCharisma = root.findViewById(R.id.charisma); - monsterDetailViewModel.getCharisma().observe(getViewLifecycleOwner(), monsterCharisma::setText); - - final TextView monsterSavingThrows = root.findViewById(R.id.saving_throws); + monsterDetailViewModel.getName().observe(getViewLifecycleOwner(), mHolder.name::setText); + monsterDetailViewModel.getMeta().observe(getViewLifecycleOwner(), mHolder.meta::setText); + monsterDetailViewModel.getArmorClass().observe(getViewLifecycleOwner(), armorText -> mHolder.armorClass.setText(Html.fromHtml("Armor Class " + armorText))); + monsterDetailViewModel.getHitPoints().observe(getViewLifecycleOwner(), hitPoints -> mHolder.hitPoints.setText(Html.fromHtml("Hit Points " + hitPoints))); + monsterDetailViewModel.getSpeed().observe(getViewLifecycleOwner(), speed -> mHolder.speed.setText(Html.fromHtml("Speed " + speed))); + monsterDetailViewModel.getStrength().observe(getViewLifecycleOwner(), mHolder.strength::setText); + monsterDetailViewModel.getDexterity().observe(getViewLifecycleOwner(), mHolder.dexterity::setText); + monsterDetailViewModel.getConstitution().observe(getViewLifecycleOwner(), mHolder.constitution::setText); + monsterDetailViewModel.getIntelligence().observe(getViewLifecycleOwner(), mHolder.intelligence::setText); + monsterDetailViewModel.getWisdom().observe(getViewLifecycleOwner(), mHolder.wisdom::setText); + monsterDetailViewModel.getCharisma().observe(getViewLifecycleOwner(), mHolder.charisma::setText); monsterDetailViewModel.getSavingThrows().observe(getViewLifecycleOwner(), savingThrows -> { if (StringHelper.isNullOrEmpty(savingThrows)) { - monsterSavingThrows.setVisibility(View.GONE); + mHolder.savingThrows.setVisibility(View.GONE); } else { - monsterSavingThrows.setVisibility(View.VISIBLE); + mHolder.savingThrows.setVisibility(View.VISIBLE); } - monsterSavingThrows.setText(Html.fromHtml("Saving Throws " + savingThrows)); + mHolder.savingThrows.setText(Html.fromHtml("Saving Throws " + savingThrows)); }); - - final TextView monsterSkills = root.findViewById(R.id.skills); monsterDetailViewModel.getSkills().observe(getViewLifecycleOwner(), skills -> { if (StringHelper.isNullOrEmpty(skills)) { - monsterSkills.setVisibility(View.GONE); + mHolder.skills.setVisibility(View.GONE); } else { - monsterSkills.setVisibility(View.VISIBLE); + mHolder.skills.setVisibility(View.VISIBLE); } - monsterSkills.setText(Html.fromHtml("Skills " + skills)); + mHolder.skills.setText(Html.fromHtml("Skills " + skills)); }); - - final TextView monsterDamageVulnerabilities = root.findViewById(R.id.damage_vulnerabilities); monsterDetailViewModel.getDamageVulnerabilities().observe(getViewLifecycleOwner(), damageType -> { if (StringHelper.isNullOrEmpty(damageType)) { - monsterDamageVulnerabilities.setVisibility(View.GONE); + mHolder.damageVulnerabilities.setVisibility(View.GONE); } else { - monsterDamageVulnerabilities.setVisibility(View.VISIBLE); + mHolder.damageVulnerabilities.setVisibility(View.VISIBLE); } - monsterDamageVulnerabilities.setText(Html.fromHtml("Damage Vulnerabilities " + damageType)); + mHolder.damageVulnerabilities.setText(Html.fromHtml("Damage Vulnerabilities " + damageType)); }); - - final TextView monsterDamageResistances = root.findViewById(R.id.damage_resistances); monsterDetailViewModel.getDamageResistances().observe(getViewLifecycleOwner(), damageType -> { if (StringHelper.isNullOrEmpty(damageType)) { - monsterDamageResistances.setVisibility(View.GONE); + mHolder.damageResistances.setVisibility(View.GONE); } else { - monsterDamageResistances.setVisibility(View.VISIBLE); + mHolder.damageResistances.setVisibility(View.VISIBLE); } - monsterDamageResistances.setText(Html.fromHtml("Damage Resistances " + damageType)); + mHolder.damageResistances.setText(Html.fromHtml("Damage Resistances " + damageType)); }); - - final TextView monsterDamageImmunities = root.findViewById(R.id.damage_immunities); monsterDetailViewModel.getDamageImmunities().observe(getViewLifecycleOwner(), damageType -> { if (StringHelper.isNullOrEmpty(damageType)) { - monsterDamageImmunities.setVisibility(View.GONE); + mHolder.damageImmunities.setVisibility(View.GONE); } else { - monsterDamageImmunities.setVisibility(View.VISIBLE); + mHolder.damageImmunities.setVisibility(View.VISIBLE); } - monsterDamageImmunities.setText(Html.fromHtml("Damage Immunities " + damageType)); + mHolder.damageImmunities.setText(Html.fromHtml("Damage Immunities " + damageType)); }); - - final TextView monsterConditionImmunities = root.findViewById(R.id.condition_immunities); monsterDetailViewModel.getConditionImmunities().observe(getViewLifecycleOwner(), conditionImmunities -> { if (StringHelper.isNullOrEmpty(conditionImmunities)) { - monsterConditionImmunities.setVisibility(View.GONE); + mHolder.conditionImmunities.setVisibility(View.GONE); } else { - monsterConditionImmunities.setVisibility(View.VISIBLE); + mHolder.conditionImmunities.setVisibility(View.VISIBLE); } - monsterConditionImmunities.setText(Html.fromHtml("Condition Immunities " + conditionImmunities)); + mHolder.conditionImmunities.setText(Html.fromHtml("Condition Immunities " + conditionImmunities)); }); - - final TextView monsterSenses = root.findViewById(R.id.senses); monsterDetailViewModel.getSenses().observe(getViewLifecycleOwner(), senses -> { if (StringHelper.isNullOrEmpty(senses)) { - monsterSenses.setVisibility(View.GONE); + mHolder.senses.setVisibility(View.GONE); } else { - monsterSenses.setVisibility(View.VISIBLE); + mHolder.senses.setVisibility(View.VISIBLE); } - monsterSenses.setText(Html.fromHtml("Senses " + senses)); + mHolder.senses.setText(Html.fromHtml("Senses " + senses)); }); - - final TextView monsterLanguages = root.findViewById(R.id.languages); monsterDetailViewModel.getLanguages().observe(getViewLifecycleOwner(), languages -> { if (StringHelper.isNullOrEmpty(languages)) { - monsterLanguages.setVisibility(View.GONE); + mHolder.languages.setVisibility(View.GONE); } else { - monsterLanguages.setVisibility(View.VISIBLE); + mHolder.languages.setVisibility(View.VISIBLE); } - monsterLanguages.setText(Html.fromHtml("Languages " + languages)); + mHolder.languages.setText(Html.fromHtml("Languages " + languages)); }); - - final TextView monsterChallenge = root.findViewById(R.id.challenge); - monsterDetailViewModel.getChallenge().observe(getViewLifecycleOwner(), challengeRating -> monsterChallenge.setText(Html.fromHtml("Challenge " + challengeRating))); - - final LinearLayout monsterAbilities = root.findViewById(R.id.abilities); + monsterDetailViewModel.getChallenge().observe(getViewLifecycleOwner(), challengeRating -> mHolder.challenge.setText(Html.fromHtml("Challenge " + challengeRating))); monsterDetailViewModel.getAbilities().observe(getViewLifecycleOwner(), abilities -> { Context context = getContext(); DisplayMetrics displayMetrics = null; @@ -190,7 +152,7 @@ public class MonsterDetailFragment extends MCFragment { displayMetrics = resources.getDisplayMetrics(); } } - monsterAbilities.removeAllViews(); + mHolder.abilities.removeAllViews(); if (abilities != null) { for (String ability : abilities) { TextView tvAbility = new TextView(context); @@ -201,12 +163,10 @@ public class MonsterDetailFragment extends MCFragment { LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, displayMetrics); tvAbility.setLayoutParams(layoutParams); - monsterAbilities.addView(tvAbility); + mHolder.abilities.addView(tvAbility); } } }); - - final LinearLayout monsterActions = root.findViewById(R.id.actions); monsterDetailViewModel.getActions().observe(getViewLifecycleOwner(), actions -> { Context context = getContext(); DisplayMetrics displayMetrics = null; @@ -216,7 +176,7 @@ public class MonsterDetailFragment extends MCFragment { displayMetrics = resources.getDisplayMetrics(); } } - monsterActions.removeAllViews(); + mHolder.actions.removeAllViews(); if (actions != null) { for (String action : actions) { TextView tvAction = new TextView(getContext()); @@ -224,7 +184,7 @@ public class MonsterDetailFragment extends MCFragment { LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, displayMetrics); tvAction.setLayoutParams(layoutParams); - monsterActions.addView(tvAction); + mHolder.actions.addView(tvAction); } } }); @@ -254,4 +214,62 @@ public class MonsterDetailFragment extends MCFragment { } return super.onOptionsItemSelected(item); } + + private static class ViewHolder { + final TextView name; + final TextView meta; + final TextView armorClass; + final TextView hitPoints; + final TextView speed; + final TextView strength; + final TextView dexterity; + final TextView constitution; + final TextView intelligence; + final TextView wisdom; + final TextView charisma; + final TextView savingThrows; + final TextView skills; + final TextView damageVulnerabilities; + final TextView damageResistances; + final TextView damageImmunities; + final TextView conditionImmunities; + final TextView senses; + final TextView languages; + final TextView challenge; + final LinearLayout abilities; + final LinearLayout actions; + final LinearLayout reactions; + final LinearLayout legendaryActions; + final LinearLayout lairActions; + final LinearLayout regionalEffects; + + ViewHolder(View root) { + name = root.findViewById(R.id.name); + meta = root.findViewById(R.id.meta); + armorClass = root.findViewById(R.id.armorClass); + hitPoints = root.findViewById(R.id.hitPoints); + speed = root.findViewById(R.id.speed); + strength = root.findViewById(R.id.strength); + dexterity = root.findViewById(R.id.dexterity); + constitution = root.findViewById(R.id.constitution); + intelligence = root.findViewById(R.id.intelligence); + wisdom = root.findViewById(R.id.wisdom); + charisma = root.findViewById(R.id.charisma); + savingThrows = root.findViewById(R.id.savingThrows); + skills = root.findViewById(R.id.skills); + damageVulnerabilities = root.findViewById(R.id.damageVulnerabilities); + damageResistances = root.findViewById(R.id.damageResistances); + damageImmunities = root.findViewById(R.id.damageImmunities); + conditionImmunities = root.findViewById(R.id.conditionImmunities); + senses = root.findViewById(R.id.senses); + languages = root.findViewById(R.id.languages); + challenge = root.findViewById(R.id.challenge); + abilities = root.findViewById(R.id.abilities); + actions = root.findViewById(R.id.actions); + reactions = root.findViewById(R.id.reactions); + legendaryActions = root.findViewById(R.id.legendaryActions); + lairActions = root.findViewById(R.id.lairActions); + regionalEffects = root.findViewById(R.id.regionalEffects); + } + } } diff --git a/app/src/main/res/layout/fragment_edit_monster.xml b/app/src/main/res/layout/fragment_edit_monster.xml index 9ff084e..0e1177c 100644 --- a/app/src/main/res/layout/fragment_edit_monster.xml +++ b/app/src/main/res/layout/fragment_edit_monster.xml @@ -181,7 +181,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" - android:text="@string/label_regional_actions" + android:text="@string/label_regional_effects" android:textSize="@dimen/text_h4_size" app:drawableEndCompat="@drawable/ic_chevron_right_24" /> diff --git a/app/src/main/res/layout/fragment_monster.xml b/app/src/main/res/layout/fragment_monster.xml index 07013ab..af40099 100644 --- a/app/src/main/res/layout/fragment_monster.xml +++ b/app/src/main/res/layout/fragment_monster.xml @@ -56,7 +56,7 @@ app:layout_constraintTop_toBottomOf="@+id/meta" /> @@ -134,14 +134,14 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:textAlignment="center" - app:layout_constraintEnd_toEndOf="@+id/label_str" - app:layout_constraintStart_toStartOf="@+id/label_str" - app:layout_constraintTop_toBottomOf="@+id/label_str" + app:layout_constraintEnd_toEndOf="@+id/strength_label" + app:layout_constraintStart_toStartOf="@+id/strength_label" + app:layout_constraintTop_toBottomOf="@+id/strength_label" tools:text="2 (-4)" /> + app:layout_constraintTop_toBottomOf="@+id/actions_label" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aae151f..21805ee 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,7 +9,6 @@ Add Skill Add Trait Edit - Actions MonsterCards CHA CON @@ -66,7 +65,7 @@ None Proficient Reactions - Regional Actions + Regional Effects Saving Throws Query Senses