0

how to create context menu in RecyclerView using addOnItemTouchListener when user long click?

I have code like this

public class AllDataFragment extends Fragment{

    List<GetDataAdapterRiwayat> GetDataAdapter1;

    RecyclerView recyclerView;

    RecyclerView.LayoutManager recyclerViewlayoutManager;
    private static final String TAG = MainActivity.class.getSimpleName();

    RecyclerView.Adapter recyclerViewadapterRiwayat;

    String FIXURL = "http://192.168.43.139/AndroidFileUpload/";
    String GET_JSON_DATA_HTTP_URL = FIXURL+"GetAllData.php";
    String JSON_ID_TEMPAT_PERCETAKAN = "id_tempat_percetakan";
    String JSON_NAMA_PERCETAKAN = "nama_percetakan";
    String JSON_LATITUDE = "latitude";
    String JSON_LONGITUDE = "longitude";
    String JSON_GAMBAR = "gambar";
    String JSON_STATUS = "status";
    String JSON_EMAIL1 = "email1";
    String JSON_EMAIL2 = "email2";
    String JSON_EMAIL3 = "email3";
    SessionManager session;
    RequestQueue requestQueue ;
    String email;

    public AllDataFragment() {
        // Required empty public constructor
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        GetDataAdapter1 = new ArrayList<>();

        recyclerView = (RecyclerView) getView().findViewById(R.id.recyclerview2);

        recyclerView.setHasFixedSize(true);

        recyclerViewlayoutManager = new LinearLayoutManager(getActivity());

        recyclerView.setLayoutManager(recyclerViewlayoutManager);
        JSON_DATA_WEB_CALL();
        Log.d(TAG, "acoba nih1 : ");
        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity().getApplicationContext(), recyclerView, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, int position) {
                GetDataAdapterRiwayat GetDataAdapterRiwayat = GetDataAdapter1.get(position);
                Log.d(TAG, "acoba nih3 : ");
                Intent myIntent = new Intent(getActivity(), DetailRiwayatActivity.class);
                myIntent.putExtra("Gambar",GetDataAdapterRiwayat.getGambar());// getDataAdapter1 in your case
                myIntent.putExtra("IdTempatPercetakan",GetDataAdapterRiwayat.getIdTempatPercetakan());// getDataAdapter1 in your case
                myIntent.putExtra("NamaPercetakan",GetDataAdapterRiwayat.getNamaPercetakan());// getDataAdapter1 in your case
                myIntent.putExtra("Latitude",GetDataAdapterRiwayat.getLatitude());// getDataAdapter1 in your case
                myIntent.putExtra("Longitude",GetDataAdapterRiwayat.getLongitude());// getDataAdapter1 in your case
                myIntent.putExtra("Status",GetDataAdapterRiwayat.getStatus());// getDataAdapter1 in your case
                myIntent.putExtra("Email1",GetDataAdapterRiwayat.getEmail1());// getDataAdapter1 in your case
                myIntent.putExtra("Email2",GetDataAdapterRiwayat.getEmail2());// getDataAdapter1 in your case
                myIntent.putExtra("Email3",GetDataAdapterRiwayat.getEmail3());// getDataAdapter1 in your case
                startActivity(myIntent);

            }

            @Override
            public void onLongClick(View view, int position) {

            }
        }));
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        // Menu Item Clicked!
        return true;
    }

    public void JSON_DATA_WEB_CALL() {
        setSessionManager();
        CustomJsonArrayRequest request = new CustomJsonArrayRequest (GET_JSON_DATA_HTTP_URL  + "?&email="+email,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        JSON_PARSE_DATA_AFTER_WEBCALL(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                });
        requestQueue = Volley.newRequestQueue(getActivity());
        requestQueue.add(request);
    }

    public void JSON_PARSE_DATA_AFTER_WEBCALL(JSONArray array){
        for(int i = 0; i<array.length(); i++) {

            GetDataAdapterRiwayat GetDataAdapter2 = new GetDataAdapterRiwayat();

            JSONObject json = null;
            try {

                json = array.getJSONObject(i);
                GetDataAdapter2.setIdTempatPercetakan(json.getString(JSON_ID_TEMPAT_PERCETAKAN));
                GetDataAdapter2.setNamaPercetakan(json.getString(JSON_NAMA_PERCETAKAN));
                GetDataAdapter2.setLatitude(json.getString(JSON_LATITUDE));
                GetDataAdapter2.setLongitude(json.getString(JSON_LONGITUDE));
                GetDataAdapter2.setGambar(json.getString(JSON_GAMBAR));
                GetDataAdapter2.setStatus(json.getString(JSON_STATUS));
                GetDataAdapter2.setEmail1(json.getString(JSON_EMAIL1));
                GetDataAdapter2.setEmail2(json.getString(JSON_EMAIL2));
                GetDataAdapter2.setEmail3(json.getString(JSON_EMAIL3));
            } catch (JSONException e) {

                e.printStackTrace();
            }
            GetDataAdapter1.add(GetDataAdapter2);
        }

        recyclerViewadapterRiwayat = new RecyclerViewAdapterRiwayat(GetDataAdapter1, getActivity());

        recyclerView.setAdapter(recyclerViewadapterRiwayat);
    }

    private void setSessionManager() {
        session = new SessionManager(getActivity().getApplicationContext());
        session.checkLogin();

        // get user data from session
        HashMap<String, String> user = session.getUserDetails();
        // email
        email = user.get(SessionManager.KEY_EMAILUSER);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.activity_all_data, container, false);
    }

    @Override
    public void onClick(View v) {

    }

}
Maurício
  • 119
  • 6
Eggy Sudianto
  • 277
  • 3
  • 15
  • You need to register the recycler for contextmenus in the host activity, then call showContextMenu (on your viewholder itemview) in your long click. – Saik Caskey Mar 22 '17 at 10:49
  • @SaikCaskey how to register that? – Eggy Sudianto Mar 22 '17 at 10:52
  • call the function registerForContextMenu in your activity (here's [the docs](https://developer.android.com/reference/android/app/Activity.html#registerForContextMenu(android.view.View)) - it's an Activity function – Saik Caskey Mar 22 '17 at 10:54
  • i.e., Context.this.registerForContextMenu(mRecyclerView); you can actually do it in a fragment as well – Saik Caskey Mar 22 '17 at 10:56
  • @EggySudianto Try the answer posted below – Suhayl SH Mar 22 '17 at 11:07
  • @SaikCaskey sorry I can't understand, I write my full code maybe it can help to hel me fix it – Eggy Sudianto Mar 22 '17 at 11:14
  • OP doesn't sound like he knew what he wanted- would just like to note that there's a clear distinction between a ContextMenu and a contextual menu for a view item. One appears anchored to a view (think songs in Play Music app), the other appears in the middle of the screen with everything else greyed out – Saik Caskey Mar 22 '17 at 12:10

2 Answers2

1

Give this a try:

Note: Make sure you add this to adapter class.

Add an ImageButton inside RecyclerView Adapter layout with some id like .. ivOverflowIcon.

Inside Adapter Class.

ImageButton buttonViewOption;

Inside ViewHolder(View v)

buttonViewOption= (ImageButton) v.findViewById(R.id.ivOverflowIcon);

Add this to menu: res/menu/mycontextmenu.xml

    <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/menu1"
        android:title="Menu 1" />

    <item
        android:id="@+id/menu2"
        android:title="Menu 2" />

    <item
        android:id="@+id/menu3"
        android:title="Menu 3" />


</menu>

//Now in your adapter inside onBindViewHolder() use the following code.

holder.buttonViewOption.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //creating a popup menu
                PopupMenu popup = new PopupMenu(mCtx, holder.buttonViewOption);
                //inflating menu from xml resource
                popup.inflate(R.menu.mycontextmenu);
                //adding click listener
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.menu1:
                                //handle menu1 click
                                break;
                            case R.id.menu2:
                                //handle menu2 click
                                break;
                            case R.id.menu3:
                                //handle menu3 click
                                break;
                        }
                        return false;
                    }
                });
                //displaying the popup
                popup.show();

            }
        });
Suhayl SH
  • 1,213
  • 1
  • 11
  • 16
  • if I use that how to edit the `addOnItemTouchListener` because I use that – Eggy Sudianto Mar 22 '17 at 11:24
  • You have to add the above code in Adapter class. What you can do is add an icon to adapter layout and set onclick listener to that icon inside onBindViewHolder() – Suhayl SH Mar 22 '17 at 11:35
  • I'm trying.. what data types for `mRecyclerView`? and cannot resolve symbol `one` until `four` in case – Eggy Sudianto Mar 22 '17 at 11:42
  • mCtx is the context. For buttonViewOption , did you add an ImageButton to the adapter layout? – Suhayl SH Mar 22 '17 at 11:52
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/138730/discussion-between-suhayl-sh-and-eggy-sudianto). – Suhayl SH Mar 22 '17 at 11:53
0

Step 1: In Your MainActivityClass.java

private RecyclerView recyclerSavedHotel;

private ArrayList<Integer> totalHotel;
private ArrayList<String> nameCity;

TextView tvNoSavedHotel;
RecyclerView.Adapter adapter;

private static final String TAG = "SavedHotelClass";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    nameCity = new ArrayList();
    totalHotel = new ArrayList();

    nameCity.add("Ahmedabad");
    nameCity.add("Bhavnagar");

    nameCity.add("Mahuva");
    nameCity.add("Pune");

    nameCity.add("Bhavnagar");
    nameCity.add("Bhopal");

    nameCity.add("Rojkot");
    nameCity.add("Mahuva");

    nameCity.add("Agra");
    nameCity.add("Vadodra");

    totalHotel.add(1);
    totalHotel.add(2);

    totalHotel.add(4);
    totalHotel.add(6);

    totalHotel.add(8);
    totalHotel.add(20);

    totalHotel.add(11);
    totalHotel.add(23);

    totalHotel.add(21);
    totalHotel.add(3);

    if (nameCity.isEmpty() || totalHotel.isEmpty()) {
        tvNoSavedHotel.setVisibility(View.VISIBLE);
    }

    initContext();
}

private void initContext() {
    recyclerSavedHotel = (RecyclerView) findViewById(R.id.recyclerview_save_hotel);
    recyclerSavedHotel.setHasFixedSize(true);

    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerSavedHotel.setLayoutManager(layoutManager);

    adapter = new RecyclerViewAdapter(nameCity, totalHotel);
    recyclerSavedHotel.setAdapter(adapter);


}

Step 2: RecyclerViewAdapter.java

private ArrayList<String> nameCity;
private ArrayList<Integer> totalHotel;

public RecyclerViewAdapter(ArrayList<String> nameCity, ArrayList<Integer> totalHotel) {
    this.nameCity = nameCity;
    this.totalHotel = totalHotel;

}

@Override
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate
            (R.layout.layout_saved_hotel, parent, false);
    return new ViewHolder(view);


}

@Override
public void onBindViewHolder(RecyclerViewAdapter.ViewHolder holder, int position) {
    holder.tvCityname.setText(nameCity.get(position));
    holder.tvTotalHotel.setText(totalHotel.get(position).toString());

}

@Override
public int getItemCount() {
    return nameCity.size();
}


public class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
    TextView tvCityname, tvTotalHotel;

    public ViewHolder(View itemView) {
        super(itemView);
        tvCityname = (TextView) itemView.findViewById(R.id.tv_saved_hotel_city_name);
        tvTotalHotel = (TextView) itemView.findViewById(R.id.tv_total_saved_hotel);
        itemView.setOnCreateContextMenuListener(this);

    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        menu.setHeaderTitle("Select The Action");
        menu.add(0, v.getId(), 0, "Call");//groupId, itemId, order, title
        menu.add(0, v.getId(), 0, "SMS");
    }
}

layout_saved_hotel

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/tools"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/cardview_saved_hotel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardUseCompatPadding="true"
app:cardBackgroundColor="@color/colorWhite">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_saved_hotel_city_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="#000"
            android:textSize="20sp" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <ImageView
                android:layout_width="15dp"
                android:layout_height="15dp"
                android:layout_marginRight="5dp"
                android:layout_marginTop="3dp"
                android:src="@mipmap/ic_heart_red" />

            <TextView
                android:id="@+id/tv_total_saved_hotel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="5dp" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Hotel saved" />

        </LinearLayout>

    </LinearLayout>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:src="@mipmap/ic_next_black" />

</LinearLayout>

MainActivity

 <android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerview_save_hotel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

</android.support.v7.widget.RecyclerView>
ND1010_
  • 3,743
  • 24
  • 41