How to pass values from RecycleAdapter to MainActivity or Other Activities

前端 未结 6 1164
小蘑菇
小蘑菇 2020-12-12 16:04

I am working on a shopping cart app,Items are displayed as below.There is a plus, minus (+/-) buttons to choose the number of quantity.

If product quantity is chang

相关标签:
6条回答
  • 2020-12-12 16:11

    You should create interface, and activity implements this interface.

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

    When you create adapter (last parameter is this 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
    }
    

    // In Adapter

      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());
        }
    
    0 讨论(0)
  • 2020-12-12 16:13

    Check out this. It works for me.

    Just Paste in Your Activity or 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 讨论(0)
  • 2020-12-12 16:13
    //Simply it works for me
    //In onBindViewHolder of RecyclerAdapter write the following code on clickEvent of any view;
    
    
    Intent intent = new Intent(tContext, TargetActivity.class);
    intent.putExtra("key", "value");
    tContext.startActivity(intent);
    
    
    //TargetActivity.java
    
      String str = getIntent().getStringExtra("key");
    //You got the value as String :)
    
    0 讨论(0)
  • 2020-12-12 16:15

    I failed to do it with both Interface and Observer pattern. But Local Broadcast worked for me.

    In Adapter

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

    Main Activity

    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();
            }
        };
    
    0 讨论(0)
  • 2020-12-12 16:30

    add these codes in onBindViewHolder

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

    Add on MainActivity

        public BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
            String name= intent.getStringExtra("name");
            Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show();
            }
        };
        LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,new IntentFilter("message_subject_intent"));
    
    0 讨论(0)
  • 2020-12-12 16:32

    Three popular ways to solve this problem

    1. Interfaces

    Phuoc Huynh has already explained how to use interfaces to solves this.

    1. Observer pattern.

    Try googling around observer to understand how it works. We will register the classes who want to receive events with the type of events they want to receive. There will be a manager classes to manage registering and unregistering of receivers and also to send the events to all receivers

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

    Your MainActivity will register itself as a receiver of increment and decrement events and also implement onEvent method of 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)
        }
    }
    

    In you adapter class send the events

    EventManager.getInstance().sendEvent("increment");
    EventManager.getInstance().sendEvent("decrement");
    
    1. LocalBroadcasts

    LocalBroadcasts works the same way as the above example. you have get Instance of LocalBroadcastManger and send Broadcast on it. Define a broadcast receiver in the onCreate of the activity and register it using registerReceiver() in the Activity. Pass an intent filter in the register receiver with actiontype same as the broadcasts you want your activity to receive. Make sure you unregister the broadcasts whenever you don't need them or in the onDestroy of the activity

    0 讨论(0)
提交回复
热议问题