web-dev-qa-db-ja.com

RecycleAdapterからMainActivityまたはその他のアクティビティに値を渡す方法

ショッピングカートアプリで作業しています。アイテムは以下のように表示されます。数量の数を選択するためのプラス、マイナス(+/-)ボタンがあります。

製品の数量が変更された場合、「productname」と「quantity」をメインアクティビティに渡して、最終的なカートの準備に使用できるようにする必要があります。データベースまたはコンテンツプロバイダーを使用するための提案がありましたが、

私はそれを行う方法がわからない..、助けてください

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



    }
}

これを行う方法、

20
Joseph Joseph

インターフェースとオブザーバーの両方のパターンで失敗しました。しかし、ローカル放送は私のために働いた。

アダプター内

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

インターフェイスを作成する必要があり、アクティビティはこのインターフェイスを実装します。

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

この問題を解決する3つの一般的な方法

  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は、それ自体を増分イベントと減分イベントのレシーバーとして登録し、IEventListenerのonEventメソッドも実装します。

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でブロードキャストレシーバーを定義し、ActivityでregisterReceiver()を使用して登録します。アクティビティで受信するブロードキャストと同じactiontypeを使用して、登録レシーバーにインテントフィルターを渡します。ブロードキャストが不要な場合、またはアクティビティのonDestroyの場合は、必ずブロードキャストを登録解除してください。

5
Suhaib Roomy

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

これをチェックしてください。それは私のために動作します。

アクティビティまたはフラグメントを貼り付けるだけです

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);
                    }
                });
1
Aasik
//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
Tousif Akram