Home > Back-end >  Cant get my API data to display on other pages
Cant get my API data to display on other pages

Time:11-18

The code I've done was followed closely by a few YouTube tutorials. I'm designing an Age of Empires app that takes in the data from a public API. When the user progresses through the pages then different parts of the API data are shown. What I wanted it to do was get the data from the main activity (where the API is retrieved) and put some of its many data into the UniqueUnit page. It's using something called serializable which I can't quite understand how it works yet.

For the record, it works in getting the data from page 'DetailedCivilization' but just completely breaks on 'UniqueUnit'page.

MainActivity.java

package com.example.ageofempires2;

import ...


public class MainActivity extends AppCompatActivity {
    public static final String TAG = "tag";
    RecyclerView itemList;
    Adapter adapter;
    List<Civilizations> all_civilizations;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().setTitle("Civilizations menu");
        all_civilizations = new ArrayList<>();
        itemList = findViewById(R.id.itemList);
        itemList.setLayoutManager(new LinearLayoutManager(this));
        adapter = new Adapter(this, all_civilizations);
        itemList.setAdapter(adapter);

        getJsonData();

    }

    private void getJsonData() {
        String URL = "https://age-of-empires-2-api.herokuapp.com/api/v1/civilizations";
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        JsonObjectRequest objectRequest = new JsonObjectRequest(Request.Method.GET, URL, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONArray civilizations = response.getJSONArray("civilizations");
                    JSONObject civilizationsData = civilizations.getJSONObject(0);

                    Log.d(TAG, "onResponse "  civilizationsData);

                    for (int i=0; i< civilizationsData.length();i  ){
                        JSONObject civilization = civilizations.getJSONObject(i);
                        Civilizations v = new Civilizations();

                        v.setName(civilization.getString("name"));
                        v.setArmy_type(civilization.getString("army_type"));
                        v.setExpansion(civilization.getString("expansion"));
                        v.setCivilization_bonus(civilization.getString("civilization_bonus"));
                        v.setUnique_unit(civilization.getString("unique_unit"));

                        all_civilizations.add(v);
                        adapter.notifyDataSetChanged();
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d(TAG, "onErrorResponse"   error.getMessage());
            }
        });
        requestQueue.add(objectRequest);
    }
}


 

Adapter.java

     package com.example.ageofempires2;
        
          import ...
        
        public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
            private List<Civilizations> allCivilizations;
            private Context context;
        
            public Adapter(Context ctx, List<Civilizations> civilizationsData){
                this.allCivilizations = civilizationsData;
                this.context = ctx;
            }
        
            @NonNull
            @Override
            public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.civilization_view,parent,false);
                return new ViewHolder(v);
            }
            @Override
            public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
                holder.titleName.setText(allCivilizations.get(position).getName());
        
                holder.vv.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Bundle b = new Bundle();
                        b.putSerializable("civilizationsData", allCivilizations.get(position));
                        Intent i = new Intent(context, DetailedCivilization.class);
                        i.putExtras(b);
                        v.getContext().startActivity(i);
                    }
                });
        
            }
        
            @Override
            public int getItemCount() {
                return allCivilizations.size();
            }
        
            public class ViewHolder extends  RecyclerView.ViewHolder{
                TextView titleName;
                TextView expansionName;
                View vv;
                public ViewHolder(@NonNull View itemView) {
                    super(itemView);
        
                    titleName = itemView.findViewById(R.id.civilizationUniqueUnits);
                    expansionName = itemView.findViewById(R.id.civilizationUnitDescription);
                    vv = itemView;
        
        
                }
            }
        }
     

Civilizations.java

    package com.example.ageofempires2;
    
    import java.io.Serializable;
    
    public class Civilizations implements Serializable {
        private String name;
        private String expansion;
        private String army_type;
        private String civilization_bonus;
        private String unique_unit;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getExpansion() {
            return expansion;
        }
    
        public void setExpansion(String expansion) {
            this.expansion = expansion;
        }
    
        public String getArmy_type() {
            return army_type;
        }
    
        public void setArmy_type(String army_type) {
            this.army_type = army_type;
        }
    
        public String getCivilization_bonus() {
            return civilization_bonus;
        }
    
        public void setCivilization_bonus(String civilization_bonus) {this.civilization_bonus = civilization_bonus; }
    
        public String getUnique_unit() {
            return unique_unit;
        }
    
        public void setUnique_unit(String unique_unit) {this.unique_unit = unique_unit; }
    
    
    }

UniqueUnits.java

package com.example.ageofempires2;

    import ...


public class UniqueUnit extends AppCompatActivity {

    public static final String TAG = "TAG";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_unique_unit);
        getSupportActionBar().setTitle("Unique Unit");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Intent incomingIntent = getIntent();
        Bundle incomingName = incomingIntent.getExtras();
        Civilizations v = (Civilizations) incomingName.getSerializable("civilizationsData");
        Log.d(TAG, "onCreate: IDK MAN IT SHOULD WORK??"  incomingName);
        TextView unit = findViewById(R.id.civilizationUnitDescription);
        unit.setText(v.getUnique_unit());
    }
}

DetailedCivilization.java

package com.example.ageofempires2;

    import ...


public class DetailedCivilization extends AppCompatActivity {

    public static final String TAG = "TAG";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detailed_civilization);
        getSupportActionBar().setTitle("Detailed view");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Intent i = getIntent();
        Bundle data = i.getExtras();
        Civilizations v = (Civilizations) data.getSerializable("civilizationsData");

        TextView type = findViewById(R.id.civilizationType);
        type.setText(v.getArmy_type());

        TextView title = findViewById(R.id.civilizationUniqueUnits);
        title.setText(v.getName());

        TextView expansions = findViewById(R.id.civilizationUnitDescription);
        expansions.setText(v.getExpansion());

        TextView bonus = findViewById(R.id.civilizationBonus);
        bonus.setText(v.getCivilization_bonus());

        Button changeActivityTech = findViewById(R.id.tech_button);
        Button changeActivityUnit = findViewById(R.id.unit_button);
        changeActivityTech.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                activityTech();
            }
        });
        changeActivityUnit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                activityUnit();
            }
        });
    }
    private void activityTech(){
        Intent intent = new Intent(this, UniqueTech.class);
        startActivity(intent);
    }
    private void activityUnit(){
        Intent intent = new Intent(this, UniqueUnit.class);
        startActivity(intent);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if(item.getItemId() == android.R.id.home){
            onBackPressed();
        }
        return super.onOptionsItemSelected(item);
    }

}

CodePudding user response:

Solutions is

private void activityUnit(Civilizations civ){
        Bundle b = new Bundle();
        b.putSerializable("civilizationsData", civ)
        Intent intent = new Intent(this, UniqueUnit.class);
        intent.putExtras(b);
        startActivity(intent);
}

In DetailedCivilization.java Rename v from line Civilizations v = (Civilizations) incomingName.getSerializable("civilizationsData"); to civ or something more descriptive

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detailed_civilization);
        getSupportActionBar().setTitle("Detailed view");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Intent i = getIntent();
        Bundle data = i.getExtras();
        Civilizations civ = (Civilizations) data.getSerializable("civilizationsData");

        TextView type = findViewById(R.id.civilizationType);
        type.setText(v.getArmy_type());

        TextView title = findViewById(R.id.civilizationUniqueUnits);
        title.setText(v.getName());

        TextView expansions = findViewById(R.id.civilizationUnitDescription);
        expansions.setText(v.getExpansion());

        TextView bonus = findViewById(R.id.civilizationBonus);
        bonus.setText(v.getCivilization_bonus());

        Button changeActivityTech = findViewById(R.id.tech_button);
        Button changeActivityUnit = findViewById(R.id.unit_button);
        changeActivityTech.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                activityTech();
            }
        });
        changeActivityUnit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                activityUnit(civ);
            }
        });
    }

And pass Civilizations when you call activityUnit function

Basically you forgot to pass Civilizations when you go from DetailedCivilization.java to UniqueUnits.java

  • Related