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

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

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

Я не уверен, как это сделать.., радовать помогите!--3-->

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



    }
}

Как сделать

3 ответов


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

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

Я не смог сделать это как с интерфейсом, так и с шаблоном наблюдателя. Но местное вещание работало на меня.

Адаптер

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

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

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

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

  1. шаблон Observer.

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

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 () в действии. Передайте фильтр намерений в приемнике регистра с actiontype таким же, как трансляции, которые вы хотите получить. Убедитесь, что вы отменяете регистрацию передач, когда они вам не нужны, или в onDestroy действия