Как передать данные из одного действия в другое - PullRequest
1 голос
/ 28 июня 2019

Я создаю приложение для событий, которое содержит список событий в recyclerview.

События recyclerview состоят из имени события, изображения, даты и времени, изображения сердца (например, кнопка в форме сердца в Instagram), которая изменит свой цвет, когда пользователь нажимает кнопку «заинтересованный».

После нажатия на любое событие появляется его описание и есть две кнопки: «заинтересован» и «собирается». Если пользователь нажимает «заинтересованный», цвет сердца в recyclerview станет желтым. Событие также будет сохранено в другом списке, где оно будет сохраняться до тех пор, пока оно не будет удалено из сохраненного списка.

Пока что я завершил сохранение этого события в сохраненном списке, нажав кнопку «заинтересован». Но я не знаю, как изменить цвет сердца одновременно и как сохранить его, пока событие не будет удалено из сохраненного списка.

Первое действие, вызывающее адаптер повторного просмотра

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

   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);

            }
        }



    }

Это второе занятие

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);
    }


}

У меня есть изображение сердца в моем обзоре переработчика. И когда я нажимаю на кнопку интереса в описании действия, изображение сердца в программе повторного просмотра меняется.

Ответы [ 4 ]

0 голосов
/ 28 июня 2019

В первое действие

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

Начиная с второе действие , вы должны выполнить приведенный ниже код перед тем, как действие будет уничтожено при завершении () или обратного нажатия(Для этого вы можете переопределить onBackPressed для второго действия, удалить вызов суперкласса и вызвать приведенный ниже метод).

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

Снова в первое действие вы должны обработать результат внутри метода onActivityResult.

@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");
            }
        }
    }

Обновление

Вы можете использовать интерфейс в качестве обратного вызова от адаптера к активности.startActivityForResult может вызываться внутри метода обратного вызова интерфейса.Вы должны передать интерфейс обратного вызова адаптеру через конструктор адаптера вместе с набором данных.

объявите этот интерфейс внутри адаптера

public interface AdapterCallback{

        void onAdapterSelected(int pos);

    }

И в первое действие реализуйте интерфейс следующим образом.

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

Затем установите адаптер следующим образом .

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);

Изменения адаптера ниже.(Вы должны передать данные списка вместе с обратным вызовом, как вы уже это делаете)

    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);
                }


   });
    }

Интерфейс также входит в адаптер.Я не повторяю это здесь, как я уже упоминал вначале

0 голосов
/ 28 июня 2019

Вы можете применить color событие onclick к кнопке сердца, как следующий код:

your_image_id.setBackgroundColor(getResources().getColor(R.color.yellow));
0 голосов
/ 28 июня 2019

Вы можете сделать это с помощью startActivityforresult

В Activity1 запустите Activity2 как:

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

В Activity2 используйте setResultдля отправки данных обратно:

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

А в Activity1 получите данные с onActivityResult:

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();
        }     
    }
} 
0 голосов
/ 28 июня 2019

Предполагая, что вы сохраняете события в некотором классе модели, вы можете при вызове метода onBindViewHolder вашего адаптера проверить, помечено ли событие как сохранение.Если это так, то вам нужно либо изменить изображение сердца на другое изображение желтого цвета, либо вы можете применить оттенок к изображению сердца, чтобы сделать его желтым.

Вы можете изменить рисование с помощью этого кода

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

Вы можете применить оттенок, используя этот код

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

РЕДАКТИРОВАТЬ (на основе комментария)

Если сердце находится вПервое действие и заинтересованная кнопка во втором действии, что вам нужно сделать, это сохранить состояние события, когда вы нажимаете на заинтересованную кнопку.Вернувшись к первому упражнению, вы можете проверить состояние события, а затем обновить изображение, используя любой из двух указанных выше методов.

РЕДАКТИРОВАТЬ 2 (на основе нового общего кода)

После того, как вы получите ответ от своего вызова Volley, вы должны где-то сохранить идентификатор события, чтобы отследить, какие события вас интересуют (это может быть либо в классе модели, либо в некотором глобальном списке).,Когда вы вернетесь к своему первому действию (которое содержит обзор реселлера), вам нужно проверить каждый идентификатор события с имеющимся у вас списком сохраненных событий и изменить сердце для каждого соответствующего события.

...