0

I'm making an app in Android.

I'm getting JSON data containing pokemons name from URL(http://kerast.com/pokemon/pokemons.json) using retrofit. The names and types display in a recyclerView and after clicking on one another Activity opens and display attack, defense and moves.

So far I've been able to open a new activity but have no idea how to pass the object. I suppose there is no need to reload the json by re writing the same code twice for each activity ?

Here is my class :

public class Pokemon {

    private String name;
    private String type;
    private Integer attack;
    private Integer defense;
    private Integer evolveLevel;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }

    public Integer getattack() { return attack; }

    public Integer getdefense() { return defense; }

    public Integer getEvolveLevel() { return evolveLevel; }
}

My DataAdpater :

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> implements Filterable {

    private ArrayList<Pokemon> mArrayList;
    private ArrayList<Pokemon> mFilteredList;



    public DataAdapter(ArrayList<Pokemon> arrayList) {
        mArrayList = arrayList;
        mFilteredList = arrayList;

    }

    @Override
    public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, int i) {

        viewHolder.tv_name.setText(mFilteredList.get(i).getName());
        viewHolder.tv_version.setText(mFilteredList.get(i).getName());
        viewHolder.tv_api_level.setText(mFilteredList.get(i).getType());
    }

    @Override
    public int getItemCount() {

        return mFilteredList.size();
    }

    @Override
    public Filter getFilter() {

        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {

                String charString = charSequence.toString();

                if (charString.isEmpty()) {

                    mFilteredList = mArrayList;
                } else {

                    ArrayList<Pokemon> filteredList = new ArrayList<>();

                    for (Pokemon marraylist : mArrayList) {

                        if (marraylist.getName().toLowerCase().contains(charString) ||  marraylist.getType().toLowerCase().contains(charString)) {

                            filteredList.add(marraylist);
                        }
                    }

                    mFilteredList = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = mFilteredList;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                mFilteredList = (ArrayList<Pokemon>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        private TextView tv_name,tv_version,tv_api_level;
        public ViewHolder(View view) {
            super(view);

            tv_name = (TextView)view.findViewById(R.id.tv_name);
            tv_version = (TextView)view.findViewById(R.id.tv_version);
            tv_api_level = (TextView)view.findViewById(R.id.tv_api_level);

            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(view.getContext(), Main2Activity.class);
                    intent.putExtra("attack", Pokemon);
                    view.getContext().startActivity(intent);
                }
            });

        }
    }

}

And finally my MainActivity :

public class MainActivity extends AppCompatActivity {

    public static final String BASE_URL = "http://kerast.com";
    private RecyclerView mRecyclerView;
    private ArrayList<Pokemon> mArrayList;
    private DataAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        initViews();
        loadJSON();
    }

    private void initViews(){
        mRecyclerView = (RecyclerView)findViewById(R.id.card_recycler_view);
        mRecyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);
    }
    private void loadJSON(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        RequestInterface request = retrofit.create(RequestInterface.class);
        Call<JSONResponse> call = request.getJSON();
        call.enqueue(new Callback<JSONResponse>() {
            @Override
            public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) {

                JSONResponse jsonResponse = response.body();
                mArrayList = new ArrayList<>(Arrays.asList(jsonResponse.getPokemons()));
                mAdapter = new DataAdapter(mArrayList);
                mRecyclerView.setAdapter(mAdapter);
            }

            @Override
            public void onFailure(Call<JSONResponse> call, Throwable t) {
                Log.d("Error",t.getMessage());
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu_main, menu);

        MenuItem search = menu.findItem(R.id.search);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(search);
        search(searchView);
        return true;
    }

    private void search(SearchView searchView) {

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {

                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                mAdapter.getFilter().filter(newText);
                return true;
            }
        });
    }
}

So how can I get only Attack Defense and evolveLevel to be display in the second Activity ?

Sam Caneau
  • 69
  • 1
  • 10

2 Answers2

0

implement the Serializable interface Pokemon implements Serializable and then you can pass object instances in the intent extra using the putExtra()

//send : 
intent.putExtra("Pokemon", obj);
//retrieve :
getIntent().getSerializableExtra("MyClass");
akshay_shahane
  • 3,273
  • 1
  • 13
  • 29
0

Well answer by akshay is correct but i think this will better way to do it. We can use Parcelable class instead of Serializable.

Refer the following link for difference b/w parcelable and serializale

and to create a POJO class paracelable i use online creator.

Rest is the same

//Sending data
intent.putExtra("String name", object);

//Receving end
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
    Pokemon pokemon = (Pokemon) bundle.getParcelable("String name")
}
Yatin
  • 183
  • 1
  • 10
  • Thanks for your answer ! I don't understand what should "object" do ? 'cause i'm getting an error. I replaced it with "Pokemon" and it works but it still underline Pokemon and says : "expression expected" – Sam Caneau Jul 09 '17 at 20:10
  • As yatin mentioned, use parcelable and only serialize those properties which you want in next activity. You can use plugin in android studio, which asks you for fields and will parcel the datas for you. – Ritesh Jul 09 '17 at 20:55
  • @SamCaneau you should use mArrayList instead of object. So in your target activity you can receive the whole arraylist of pokemon. `ArrayList pokemons = (ArrayList) bundle.get("String name");` – Yatin Jul 10 '17 at 02:59