web-dev-qa-db-fra.com

Comment passer des valeurs de RecycleAdapter à MainActivity ou à d'autres activités

Je travaille sur une application de panier, les articles sont affichés comme ci-dessous. Il y a des boutons plus, moins (+/-) pour choisir le nombre de quantité. 

Si la quantité de produit est modifiée, je dois passer "nom du produit" et "quantité" à l'activité principale afin de pouvoir les utiliser pour préparer le panier final. J'ai eu quelques suggestions pour utiliser une base de données ou des fournisseurs de contenu, 

Je ne sais pas comment le faire .., aidez s'il vous plaît

Recycle Adapter for Shoping cart

MainActivity.Java

import Android.app.ProgressDialog;
import Android.os.AsyncTask;
import Android.os.Bundle;
import Android.support.v7.app.AppCompatActivity;
import Android.support.v7.widget.LinearLayoutManager;
import Android.support.v7.widget.RecyclerView;
import Android.support.v7.widget.Toolbar;
import Android.view.Window;
import Android.widget.Toast;

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

import Java.io.BufferedReader;
import Java.io.InputStreamReader;
import Java.net.HttpURLConnection;
import Java.net.URL;
import Java.util.ArrayList;
import Java.util.HashMap;
import Java.util.List;

public class MainActivity extends AppCompatActivity {

RecyclerView recyclerView;
RecycleAdapter recycleAdapter;
List<HashMap<String, String>> onlineData;
ProgressDialog pd;

Toolbar toolbar;

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

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getBaseContext());
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setHasFixedSize(true);

    final String url = "http://www.qa4.org/?json=get_recent_posts&count=45";
    new AsyncHttpTask().execute(url);



}

public class AsyncHttpTask extends AsyncTask<String, Void, Integer> {

    @Override
    protected void onPreExecute() {
        pd=new ProgressDialog(MainActivity.this);
        pd.requestWindowFeature(Window.FEATURE_NO_TITLE);
        pd.setMessage("Loading please wait...");
        pd.setCancelable(false);
        pd.show();
    }

    @Override
    protected Integer doInBackground(String... params) {
        Integer result = 0;
        HttpURLConnection urlConnection;
        try {
            URL url = new URL(params[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            int statusCode = urlConnection.getResponseCode();

            // 200 represents HTTP OK
            if (statusCode == 200) {
                BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = r.readLine()) != null) {
                    response.append(line);
                }
                parseResult(response.toString());
                result = 1; // Successful
            } else {
                result = 0; //"Failed to fetch data!";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result; //"Failed to fetch data!";
    }

    @Override
    protected void onPostExecute(Integer result) {
        // Download complete. Let us update UI
        pd.dismiss();

        if (result == 1) {
            recycleAdapter = new RecycleAdapter(MainActivity.this,onlineData);
            recyclerView.setAdapter(recycleAdapter);
        } else {
            Toast.makeText(MainActivity.this, "Failed to fetch data!", Toast.LENGTH_SHORT).show();
        }
    }
}

private void parseResult(String result) {
    try {
        JSONObject response = new JSONObject(result);
        JSONArray posts = response.optJSONArray("posts");
        onlineData = new ArrayList<>();

        for (int i = 0; i < posts.length(); i++) {
            JSONObject post = posts.optJSONObject(i);

            HashMap<String, String> item = new HashMap<>();
            item.put("title", post.optString("title"));

            JSONArray jsonArray = post.getJSONArray("attachments");
            JSONObject jsonObject1 = jsonArray.getJSONObject(0);
            JSONObject jsonArrayImages = jsonObject1.getJSONObject("images");
            JSONObject jsonArrayThumb = jsonArrayImages.getJSONObject("thumbnail");

            item.put("thump", jsonArrayThumb.optString("url"));

            onlineData.add(item);


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

}

RecycleAdapter.Java

import Android.content.Context;
import Android.database.sqlite.SQLiteDatabase;
import Android.support.v7.widget.RecyclerView;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.ImageView;
import Android.widget.TextView;

import com.squareup.picasso.Picasso;

import Java.util.HashMap;
import Java.util.List;

public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.ViewHolderRec> {

    List<HashMap<String, String>> onlineData;
    SQLiteDatabase db;
    Context context;
    RecycleAdapter(Context context,List<HashMap<String, String>> onlineData){
        this.onlineData = onlineData;
        this.context=context;
    }

    @Override
    public ViewHolderRec onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ViewHolderRec( LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycle, parent, false));

       }

    @Override
    public void onBindViewHolder(ViewHolderRec holder, int position) {

    HashMap<String,String> map =onlineData.get(position);

        //Download image using picasso library
        Picasso.with(context).load(map.get("thump"))
                .error(R.drawable.placeholder)
                .placeholder(R.drawable.placeholder)
                .into(holder.iv);

        holder.tv.setText(map.get("title"));

    }

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

    public class ViewHolderRec extends RecyclerView.ViewHolder implements View.OnClickListener{
        ImageView iv;
        TextView tv, quantity;
        ImageView Add_Cart;
        ImageView Remove_Cart;

        public ViewHolderRec(View itemView) {
            super(itemView);
            iv = (ImageView) itemView.findViewById(R.id.thumbnail);
            tv = (TextView) itemView.findViewById(R.id.title);
            quantity = (TextView)itemView.findViewById(R.id.cart_qty);
            Add_Cart = (ImageView)itemView.findViewById(R.id.cart_add);
            Remove_Cart = (ImageView)itemView.findViewById(R.id.cart_remove);
            itemView.setOnClickListener(this);
            Add_Cart.setOnClickListener(this);
            Remove_Cart.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if(v.getId() == Add_Cart.getId())
            {
                 increment();



            }
            else if(v.getId() == Remove_Cart.getId())
            {
                decrement();

            }
        }

        public void increment(){
            int currentNos = Integer.parseInt(quantity.getText().toString()) ;
           quantity.setText(String.valueOf(++currentNos));
        }

        public void decrement(){
            int currentNos = Integer.parseInt(quantity.getText().toString()) ;

            quantity.setText(String.valueOf(--currentNos));
        }



    }
}

Comment faire ça,

14
Joseph Joseph

Je n'ai pas réussi à le faire avec les modèles Interface et Observer. Mais la diffusion locale a fonctionné pour moi.

Dans l'adaptateur

String ItemName = tv.getText().toString();
                String qty = quantity.getText().toString();
                Intent intent = new Intent("custom-message");
                //            intent.putExtra("quantity",Integer.parseInt(quantity.getText().toString()));
                intent.putExtra("quantity",qty);
                intent.putExtra("item",ItemName);
                LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

Activité principale

public void onCreate(Bundle savedInstanceState) {

  ...

  // Register to receive messages.
  // We are registering an observer (mMessageReceiver) to receive Intents
  // with actions named "custom-message".
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("custom-message"));
}

...
public BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Get extra data included in the Intent
            String ItemName = intent.getStringExtra("item");
            String qty = intent.getStringExtra("quantity");
             Toast.makeText(MainActivity.this,ItemName +" "+qty ,Toast.LENGTH_SHORT).show();
        }
    };
17
Joseph Joseph

Vous devez créer une interface et activity met en œuvre cette interface.

public interface OnItemClick {
    void onClick (String value);
}

Lorsque vous créez un adaptateur (le dernier paramètre est cette interface)

public class MainActivity extends AppCompatActivity implements OnItemClick {
 recycleAdapter = new RecycleAdapter(MainActivity.this,onlineData, this);
            recyclerView.setAdapter(recycleAdapter);

 @Override
 void onClick (String value){
// value this data you receive when increment() / decrement() called
}

// dans l'adaptateur

  private OnItemClick mCallback;

RecycleAdapter(Context context,List<HashMap<String, String>>     onlineData,OnItemClick listener){
    this.onlineData = onlineData;
    this.context = context;
    this.mCallback = listener;
 }
    ....

    public void increment(){
        int currentNos = Integer.parseInt(quantity.getText().toString()) ;
        quantity.setText(String.valueOf(++currentNos));
        mCallback.onClick(quantity.getText().toString());
    }

    public void decrement(){
        int currentNos = Integer.parseInt(quantity.getText().toString()) ;
        quantity.setText(String.valueOf(--currentNos));
        mCallback.onClick(quantity.getText().toString());
    }
25
Phuoc Huynh

Trois façons populaires de résoudre ce problème

  1. Des interfaces

Phuoc Huynh a déjà expliqué comment utiliser des interfaces pour résoudre ce problème. 

  1. Modèle d'observateur.

Essayez de regarder Google, observateur, pour comprendre comment cela fonctionne. Nous enregistrerons les classes qui souhaitent recevoir des événements avec le type d’événements qu’elles souhaitent recevoir. Il y aura un gestionnaire de classes pour gérer l'enregistrement et le désenregistrement des destinataires et également pour envoyer les événements à tous les destinataires.

public class EventManager {
    private static EventManager eventManager;
    private static Object syncObject = new Object();
    private HashMap<String, ArrayList<EventListener>> listeners = new   HashMap<>();

    private EventManager(){}

    public static EventManager getInstance() {
        if (eventManager == null) {
            synchronized (syncObject) {
                if (eventManager == null) {
                    eventManager = new EventManager();
                }
            }
        }
        return eventManager;
    }

    public synchronized void registerListener(String event, EventListener listener) {
        if (listeners.containsKey(event)) {
            listeners.get(event).add(listener);
        } else {
            ArrayList<EventListener> arrayList = new ArrayList<>();
            arrayList.add(listener);
            listeners.put(event, arrayList);
        }
    }

    public synchronized void unRegisterListener(String event, EventListener listener) {
        if (listeners.containsKey(event)) {
            listeners.get(event).remove(listener);
            if (listeners.get(event).size() == 0) {
                listeners.remove(event);
            }
        }
    }

    public void sendEvent(String event, Object o) {
        if (listeners.containsKey(event)) {
            ArrayList<EventListener> listener = listeners.get(event);
            for (EventListener eventListener : listener) {
                eventListener.onEvent(o);
            }
        }
    }
}

Votre MainActivity s’enregistrera comme destinataire des événements d’incrémentation et de décrémentation et implémentera également la méthode onEvent de IEventListener

public class MainActivity extends AppCompatActivity implements IEventListener{
    @Override
    protected void onCreate(Bundle onSavedInstanceState) {
        EventManager.getInstance().registerEvent("increment", this);
        EventManager.getInstance().registerEvent("decrement", this)
    }

    @Override
    public void onEvent(String event) {
        if (event.equals("increment") {
            //increment
        } else if (event.equals("decrement") {
            //decrement
        }
    }

    @Override
    protected void onDestroy() {
        EventManager.getInstance().unRegisterEvent("increment", this);
        EventManager.getInstance().unRegisterEvent("decrement", this)
    }
}

Dans votre classe d'adaptateur envoyer les événements 

EventManager.getInstance().sendEvent("increment");
EventManager.getInstance().sendEvent("decrement");
  1. Diffusions locales

LocalBroadcasts fonctionne de la même manière que l'exemple ci-dessus. vous devez obtenir l’instance de LocalBroadcastManger et y envoyer une diffusion. Définissez un récepteur de diffusion dans le onCreate de l'activité et enregistrez-le en utilisant registerReceiver () dans l'activité. Passez un filtre d'intention dans le récepteur de registre avec le type d'action correspondant aux émissions que vous souhaitez que votre activité reçoive. Assurez-vous de désenregistrer les émissions chaque fois que vous n'en avez pas besoin ou dans la destruction de l'activité 

4
Suhaib Roomy

ajoute ces codes dans onBindViewHolder

Intent intent = new Intent("message_subject_intent");
intent.putExtra("name" , String.valueOf(messageSubject.getname()));
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

Ajouter sur MainActivity

LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("message_subject_intent"));

   public BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
    String name= intent.getStringExtra("id");
    Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show();
    }
};
0
Ali Eslami

Regarde ça. Ça marche pour moi.

Il suffit de coller dans votre activité ou fragment

rvSelectedProductList = Recyclerview
selcetedItemAdapter = RecyclerView Adapter
              rvSelectedProductList.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {

                        final int itemCount = selectedItemAdapter.getItemCount();

                        for (int i = 0; i < itemCount; i++) {
                            TextView tvSelling = rvSelectedProductList.getChildAt(i).findViewById(R.id.tvSelling);
                            TextView textViewDrawerTitle = rvSelectedProductList.getChildAt(i).findViewById(R.id.tvCartQty);


                            String totalamount = tvSelling.getText().toString();
                            String qty = textViewDrawerTitle.getText().toString();
                            System.out.println("qty" + qty);
                            System.out.println("total" + totalamount);
                        }
                        rvSelectedProductList.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    }
                });
0
Aasik