简体   繁体   中英

How to pass data from one activity to another activity

I'm creating an event app which contains a list of events in recyclerview .

The events recyclerview consists of the event name, image, date and time, heart image (example: heart shape like button on Instagram) which will change its color when the user clicks on the 'interested' button.

After clicking on any event its description appears and there are two buttons: 'interested' and 'going'. If the user clicks on 'interested' that heart color in the recyclerview will become yellow. The event will also get saved in another list where it will remain until that event is removed from the saved list.

So far I've completed saving that event in the saved list on clicking the 'interested' button. But I don't know how to change the heart color simultaneously and how to make it remain until the event is deleted from saved list.

First Activity calling recyclerview adapter

import android.content.Intent;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;


public class EventActivity extends AppCompatActivity {

    //this is the JSON Data URL
    //make sure you are using the correct ip else it will not work
    private static final String URL_PRODUCTS = "https://www.test.magicalballoons.co.in/priyanka/event.php?";

    //a list to store all the products

    List<Product> productList;


    //the recyclerview
    RecyclerView recyclerView;
    ImageView homemenu;

    //SwipeRefreshLayout swiper;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event);
        getSupportActionBar().hide();


        homemenu = findViewById(R.id.homemenu);

       // swiper = findViewById(R.id.swiper);



        //getting the recyclerview from xml
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));



        //initializing the productlist
        productList = new ArrayList<>();

        homemenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(EventActivity.this, MainActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                startActivity(intent);
                finish();
            }
        });




        //this method will fetch and parse json
        //to display it in recyclerview
        loadProducts();
    }

    private void loadProducts() {

        /*
         * Creating a String Request
         * The request type is GET defined by first parameter
         * The URL is defined in the second parameter
         * Then we have a Response Listener and a Error Listener
         * In response listener we will get the JSON response as a String
         * */
        StringRequest stringRequest = new StringRequest(Request.Method.GET, URL_PRODUCTS,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            //converting the string to json array object
                            JSONArray array = new JSONArray(response);

                            //traversing through all the object
                            for (int i = 0; i < array.length(); i++) {

                                //getting product object from json array
                                JSONObject product = array.getJSONObject(i);

                                //adding the product to product list
                                productList.add(new Product(
                                        product.getString("id"),
                                        product.getString("name"),
                                        product.getString("date"),
                                        product.getString("location"),
                                        product.getString("image"),
                                        product.getString("details")
                                ));
                            }

                            //creating adapter object and setting it to recyclerview
                            RecyclerViewAdapter adapter = new   RecyclerViewAdapter(EventActivity.this, productList);
                            recyclerView.setAdapter(adapter);
                            adapter.notifyDataSetChanged();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(EventActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();

                    }
                });

        //adding our stringrequest to queue
        Volley.newRequestQueue(this).add(stringRequest);
    }




    public void onBackPressed() {

        Intent intent = new Intent(EventActivity.this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
        finish();

    }


}

Recyclerview Adapter

   import android.app.Activity;
    import android.app.Dialog;
    import android.app.TimePickerDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.graphics.Color;
    import android.graphics.drawable.ColorDrawable;
    import android.os.Handler;
    import android.support.v4.widget.SwipeRefreshLayout;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.widget.CardView;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    import android.widget.Toast;

    import com.android.volley.AuthFailureError;
    import com.android.volley.Request;
    import com.android.volley.RequestQueue;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.JsonArrayRequest;
    import com.android.volley.toolbox.StringRequest;
    import com.android.volley.toolbox.Volley;
    import com.bumptech.glide.Glide;
    import com.bumptech.glide.request.RequestOptions;
    import com.google.firebase.auth.FirebaseAuth;
    import com.google.firebase.auth.FirebaseUser;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import java.text.BreakIterator;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Random;

    import static com.example.priyankaregistration.URLs.URL_EVENT;

    /**
     * Created by Aws on 11/03/2018.
     */

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

        private RequestQueue requestQueue;
        private JsonArrayRequest request;

        private Context mContext;
        private List<Product> mData;
        RequestOptions option;
        TextView total;
        ImageView colorheart,heart;




       // Dialog myDailog;
        private Dialog myDialog;





        public RecyclerViewAdapter(Context mContext, List<Product> mData) {
            this.mContext = mContext;
            this.mData = mData;
            //this.swiper = swiper;



            option=new RequestOptions().fitCenter().placeholder(R.drawable.background).error(R.drawable.background);
        }

        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            View view;
            LayoutInflater inflater = LayoutInflater.from(mContext);
            view = inflater.inflate(R.layout.fragment_conferences, parent, false);
            final MyViewHolder viewHolder = new MyViewHolder(view);
            myDialog = new Dialog(mContext);
            colorheart = (ImageView) view.findViewById(R.id.colorheart);
            heart = (ImageView) view.findViewById(R.id.heart);



            total = (TextView) view.findViewById(R.id.count);
           StringRequest stringRequest = new StringRequest(Request.Method.POST, URLs.URL_COUNT,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            //progressDialog.dismiss();
                            try {

                                JSONObject jsonObject = new JSONObject(response);

                               total.setText(jsonObject.getString("countid"));

                            } catch (JSONException e) {
                                e.printStackTrace();

                            }
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {

                        }
                    }) {
                @Override
                protected Map<String, String> getParams()  {
                    Map<String, String> params = new HashMap<>();
                    params.put("eventid", mData.get(viewHolder.getAdapterPosition()).getId());
                    return params;
                }
            };
            RequestQueue requestQueue = Volley.newRequestQueue(mContext);
            requestQueue.add(stringRequest);






            viewHolder.view_container.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Intent intent = new Intent(mContext, Description.class);

                    intent.putExtra("eventname",mData.get(viewHolder.getAdapterPosition()).getName());
                    intent.putExtra("eventid",mData.get(viewHolder.getAdapterPosition()).getId());
                    intent.putExtra("eventdate",mData.get(viewHolder.getAdapterPosition()).getDate());
                    intent.putExtra("eventloc",mData.get(viewHolder.getAdapterPosition()).getLocation());
                    intent.putExtra("eventimg",mData.get(viewHolder.getAdapterPosition()).getImage());
                    intent.putExtra("details",mData.get(viewHolder.getAdapterPosition()).getDetails());

                    mContext.startActivity(intent);



                }
            });


                    return viewHolder;
        }







        @Override
        public void onBindViewHolder(final MyViewHolder holder, final int position) {
            holder.textViewName.setText(mData.get(position).getName());
            holder.textViewDate.setText("Date : " + mData.get(position).getDate());
            holder.textViewLocation.setText("Time : " + mData.get(position).getLocation());
            Glide.with(mContext).load(mData.get(position).getImage()).apply(option).into(holder.img_thumbnail);



        }





        @Override
        public int getItemCount() {
            return mData.size();
        }



        public static class MyViewHolder extends  RecyclerView.ViewHolder{


            TextView textViewName,textViewDate, textViewLocation,total;
            ImageView img_thumbnail;

            //LinearLayout view_container;
            CardView view_container;

            public MyViewHolder(View itemView) {
                super(itemView);

                view_container = itemView.findViewById(R.id.container);

                textViewName = itemView.findViewById(R.id.textViewName);
                textViewDate = itemView.findViewById(R.id.textViewDate);
                textViewLocation = itemView.findViewById(R.id.textViewLocation);

                total = itemView.findViewById(R.id.count);

                img_thumbnail=itemView.findViewById(R.id.imageView);

            }
        }



    }

This is second activity

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.support.design.widget.Snackbar;


import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;


public class Description extends AppCompatActivity {

    TextView textViewName,textViewDate, textViewLocation, details;
    ImageView evimg,going,interest;
    RequestOptions option;
    ImageView homemenu;







    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.details);
        getSupportActionBar().hide();

        option=new RequestOptions().fitCenter().placeholder(R.drawable.background).error(R.drawable.background);

        textViewName = findViewById(R.id.textViewName);

        evimg = findViewById(R.id.evimg);
        details = findViewById(R.id.details);
        going = findViewById(R.id.going);
        interest = findViewById(R.id.interest);
        homemenu = findViewById(R.id.homemenu);



        textViewName.setText(getIntent().getStringExtra("eventname"));
        //textViewDate.setText(getIntent().getStringExtra("eventdate"));
        //textViewLocation.setText(getIntent().getStringExtra("eventloc"));
        details.setText(getIntent().getStringExtra("details"));
        details.setMovementMethod(new ScrollingMovementMethod());


        Glide.with(this).load(getIntent().getStringExtra("eventimg")).apply(option).into(evimg);

        going.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                StringRequest stringRequest = new StringRequest(Request.Method.GET, URLs.URL_EVENT+"?userid=" + SharedPrefManager.getInstance(getApplicationContext()).getUserId() + "&eventid="+ getIntent().getStringExtra("eventid"),
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String response) {

                                try {
                                    JSONObject jsonObject = new JSONObject(response);
                                    String message = jsonObject.getString("name");
                                    Intent intent = new Intent(Description.this,Ticket.class);

                                    intent.putExtra("code",message);
                                    intent.putExtra("eventimg",getIntent().getStringExtra("eventimg"));
                                    intent.putExtra("activity","NO");
                                   // intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                    jsonrequest();
                                    startActivity(intent);
                                    finish();

                                    //Toast.makeText(mContext,message,Toast.LENGTH_LONG).show();


                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();

                            }
                        }) {
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String, String> params = new HashMap<>();
                        //params.put("userid",SharedPrefManager.getInstance(getApplicationContext()).getUserId());
                        //params.put("eventid",getIntent().getStringExtra("eventid"));

                        return params;
                    }
                };

                RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
                requestQueue.add(stringRequest);


            }
        });



        interest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {

                StringRequest stringRequest = new StringRequest(Request.Method.POST, URLs.URL_EVENTSAVED ,
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String response) {

                                try {
                                    JSONObject jsonObject = new JSONObject(response);
                                    //String message = jsonObject.getString("name")
                                    Toast.makeText(getApplicationContext(),jsonObject.getString("message"),Toast.LENGTH_LONG).show();



                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
                            }
                        }) {
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String, String> params = new HashMap<>();
                        params.put("userid",SharedPrefManager.getInstance(getApplicationContext()).getUserId());
                        params.put("eventid",getIntent().getStringExtra("eventid"));

                        return params;
                    }
                };

                RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
                requestQueue.add(stringRequest);
            }
        });


        homemenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Description.this, MainActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                startActivity(intent);
                finish();
            }
        });


    }

    private void jsonrequest() {


        StringRequest stringRequest = new StringRequest(Request.Method.POST, URLs.URL_EVENTDELETED,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        //progressDialog.dismiss();
                        try {
                            JSONObject jsonObject = new JSONObject(response);
                            Toast.makeText(getApplicationContext(),jsonObject.getString("Event removed from saved list"),Toast.LENGTH_LONG).show();


                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
                        //progressDialog.dismiss();
                    }
                }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("userid",SharedPrefManager.getInstance(getApplicationContext()).getUserId());
                params.put("eventid",getIntent().getStringExtra("eventid"));

                return params;
            }
        };
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        requestQueue.add(stringRequest);
    }


}

I'm having heart image in my recyclerview . And when i click on interest buttton in Description activity the heart image in recyclerview get change.

Assuming you are saving the events in some model class, what you can do is when calling the onBindViewHolder method of your adapter, check if the event is marked as save. If it is, then you either need to change the heart image to another heart image which is yellow, or you can apply a tint on the heart image to make it yellow.

You can change drawable by using this code

heartImageView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.yellow_heart));

You can apply tint by using this code

heartImageView.setColorFilter(Color.argb(255, 255, 255, 0))

EDIT (Based on comment)

If the heart is in the first activity and the interested button is in the second activity what you need to do is to save the state of the event when you click on the interested button. Once you go back to the the first activity, you can check the state of the event and then update the image by using any of the above two methods.

EDIT 2 (Based on new code shared)

After you get the response from your Volley call, you should save the event id somewhere to keep track of which events you are interested in (this can be in either a model class or some global list). When you go back to your first activity (which contains the recyclerview), you need to check each event id with the stored event id list that you have and change the heart for each event that matches.

您可以将color onclick事件应用于心形按钮,例如以下代码:

your_image_id.setBackgroundColor(getResources().getColor(R.color.yellow));

You can do this with the help for startActivityforresult

Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, 1);

Intent intent = new Intent();
intent.putExtra("updatedArraylist", "arraylist")
setResult(RESULT_OK, intent);        
finish();

public void onActivityResult(int requestCode, int resultCode, 
Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String strArrayList = 
            data.getStringExtra("updatedArraylist");
            Gson gson = new Gson();
            Type youListType = new TypeToken<List<Model>>() {
            }.getType();
            List<Model> yourTypeList = gson.fromJson(strArrayList, 
            yourListType);
            ArrayList finalArraylist = new ArrayList<>(yourTypeList);
            yourArraylist.addAll(finalArraylist);    
            youtAdapter.notifyDataSetChanged();
        }     
    }
} 

In first activity

Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
startActivityForResult(intent, 100);

From second activity , you have to execute the below code before the activity getting destroyed by finish() or back press (For this you can override onBackPressed of second activity and remove the super class call and call the below method).

private void exitWithResult(){
    Intent returnIntent = new Intent();
    returnIntent.putExtra("result", "Id of selected item");
    setResult(Activity.RESULT_OK, returnIntent);
    finish();
}

Again in first activity you have to handle the result inside onActivityResult method.

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (requestCode == 100) {
            if(resultCode == Activity.RESULT_OK){
                String result=data.getStringExtra("result");
                Log.e("DATA", "" + result);
            }
            if (resultCode == Activity.RESULT_CANCELED) {
                //Write your code if there's no result
                Log.e("DATA", "No result");
            }
        }
    }

Update

You can use an interface as callback from adapter to activity. startActivityForResult canbe called inside the callback method of interface. You have to pass callback interface to adapter through adapter constructor along with data set.

declare this interface inside adapter

public interface AdapterCallback{

        void onAdapterSelected(int pos);

    }

And in first activity implement the interface like this.

MyAdapter.AdapterCallback callback = new MyAdapter.AdapterCallback() {
        @Override
        public void onAdapterSelected(int pos) {
            Intent intent = new Intent(getApplicationContext(), 
            SecondActivity.class);
            startActivityForResult(intent, 100);
        }
    };

Then set adapter like this .

RecyclerView rv = findViewById(R.id.rv_list);
rv.setHasFixedSize(true);
rv.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
MyAdapter adapter = new MyAdapter(callback);   //This is the only change
rv.setAdapter(adapter);

Changes in adapter below. (You should pass list data along with call back as you already does)

    private AdapterCallback callback;

        public MyAdapter(AdapterCallback callback) {
            this.callback = callback;
        }

        @Override
        public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
            viewHolder.mBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    callback.onAdapterSelected(i);
                }


   });
    }

Interface also come inside adapter. I am not repeating it here as i already mentioned at first

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM