Как передать значения из RecycleAdapter в MainActivity или другие действия

Я работаю над приложением для покупок, элементы отображаются ниже. Есть кнопки плюс, минус (+/-), чтобы выбрать количество количества.

Если количество продукта изменяется, мне нужно передать "productname" и "количество" в основное действие, чтобы я мог использовать их для подготовки окончательной корзины. У меня есть некоторые предложения по использованию базы данных или некоторых поставщиков контента,

Я не уверен, как это сделать.., пожалуйста, помогите

Адаптер для корзины покупок

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



    }
}

Как это сделать,

Ответ 1

Мне не удалось сделать это с помощью шаблона Interface и Observer. Но Local Broadcast работал у меня.

В адаптере

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

Основная деятельность

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

Ответ 2

Вы должны создать интерфейс, и активность реализует этот интерфейс.

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

При создании адаптера (последний параметр - это интерфейс)

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
}

//В адаптере

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

Ответ 3

Три популярных способа решения этой проблемы

  • Интерфейсы

Phuoc Huynh уже объяснил, как использовать интерфейсы для решения этой проблемы.

  1. Шаблон наблюдателя.

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

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

Ваша MainActivity будет регистрироваться как получатель событий увеличения и уменьшения, а также реализовать метод onEvent для 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)
    }
}

В классе адаптера отправьте события

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

LocalBroadcasts работает так же, как в приведенном выше примере. вы получаете экземпляр LocalBroadcastManger и отправляете на него трансляцию. Определите широковещательный приемник в onCreate активности и зарегистрируйте его с помощью registerReceiver() в Activity. Передайте фильтр намерений в приемнике регистров с типом действия, таким же, как и те трансляции, которые вы хотите получить от своей деятельности. Убедитесь, что вы отменили регистрацию трансляций, когда они вам не нужны, или в onDestroy активности.

Ответ 4

добавьте эти коды в onBindViewHolder

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

Добавить в 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();
    }
};

Ответ 5

Проверьте это. Меня устраивает.

Просто вставить в свою деятельность или фрагмент

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