如何在RecyclerView中使用addOnItemTouchListener创建上下文菜单

问题描述:

如何在RecyclerView中使用addOnItemTouchListener创建上下文菜单当用户长按?如何在RecyclerView中使用addOnItemTouchListener创建上下文菜单

我有这样

公共类AllDataFragment代码扩展片段{ 名单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) { 

} 

}

+0

您需要注册的回收在主机活动contextmenus,然后在长按调用showContextMenu(您viewholder ItemView控件)。 –

+0

@SaikCaskey如何注册? –

+0

在你的活动中调用函数registerForContextMenu(这里是[文档](https://developer.android.com/reference/android/app/Activity.html#registerForContextMenu(android.view.View)) - 这是一个活动函数 –

试试这个:

注意:请确保您添加到适配器类。

添加一个ImageButton里面的RecyclerView适配器布局与一些像.. ivOverflowIcon

内部适配器类。

ImageButton buttonViewOption; 

ViewHolder(View v)

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

一下添加到菜单: RES /菜单/ 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> 

//现在在适配器内部onBindViewHolder()使用下面的代码。

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

      } 
     }); 
+0

如果我使用该编辑addOnItemTouchListener因为我使用 –

+0

您必须添加上面的代码在Adapter类中。你可以做的是添加一个图标适配器布局,并设置onclick监听器内的onBindViewHolder() –

+0

我试图..什么数据类型的mRecyclerView?并且无法解析符号'one'直到'four'以防 –

步骤1:在你的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); 


} 

步骤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>