Как передать значения из 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)); } } } 

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

Я не смог сделать это с помощью интерфейса и шаблона 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); - 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(); } }; 

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

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

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

  1. Интерфейсы

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 активности