2016-07-27 26 views
3

Problem: Kann nicht ein Kontextmenü angezeigt werden eine „Löschen“ Option“zeigt, wenn auf ein Element innerhalb eines recyclerviewAndroid - Lange Klicken Sie auf RecyclerView Artikel und ContextMenu

Ergebnis erwartet longclicking: siehe Bild unten

ich bin fast da, aber ich bin etwas fehlt die contextMenu auf einem longClick angezeigt zu machen.

Hier ist, was ich in der viewHolder setzen. ich weiß nicht, was ich möchte hinzufügen, und wo die angezeigt werden Kontextmenü im onLongClick-Ereignis

Ich übersprang einige Zeilen Code und behielt die für meine Frage relevant.

Vielen Dank für Ihre Unterstützung,

Meine Schnittstelle beide Arten von Klicks

public interface OnItemClickListener{ 
    void onItemClick(int position); 
} 

public interface OnItemLongClickListener{ 
    void onItemLongClick(int position); 
} 

Viewholder Code

public void bindLongClick(final int position, final OnItemLongClickListener onItemLongClickListener) { 
     itemView.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View view) { 
       onItemLongClickListener.onItemLongClick(position); 
       return true; 
      } 
     }); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo){ 
      //menuInfo is null 
     Log.v(LOG_TAG, "grrr"); 
     contextMenu.setHeaderTitle("Select The Action"); 
     contextMenu.add(0, view.getId(), 0, "Supprimer");//groupId, itemId, order, title 
    } 

Adapter Code

zu handhaben
@Override 
    public void onBindViewHolder(CityListViewholder holder, int position) { 
     holder.cityName.setText(cityArrayList.get(position).getCityName()); 
     holder.bindClick(position, onItemClickListener); 
     holder.bindLongClick(position, onItemLongClickListener); 
    } 

Dann in der Tätigkeit - übersprungen ich was für meine Frage nicht relevant ist

mCityListAdapter = new CityListAdapter(mContext, cityArrayList, new CityListAdapter.OnItemClickListener() { 
      @Override 
      public void onItemClick(int position) { 
       mPager.setCurrentItem(position); 
       mDrawerLayout.closeDrawers(); 
      } 
     }, new CityListAdapter.OnItemLongClickListener() { 
      @Override 
      public void onItemLongClick(int position) { 
       Log.v(LOG_TAG, "Position "+position); 
      } 
     }); 

     registerForContextMenu(mRecyclerView); 

Expected result

+0

Sorry, scheint, ich habe es nicht ganz verstanden? Möchten Sie ein Popup anzeigen, wenn Sie auf ein Element klicken? –

+0

Danke Michael, ich habe meine Frage aktualisiert, indem ich eine Illustration von dem, was ich erwarte, sowie eine bessere Beschreibung meines Problems zu der Frage hinzugefügt habe. – Isabelle

+0

@millinet Kontextmenü in Long Click anzeigen. Wenn Sie Ihren Code sehen, haben Sie in LongClick nichts implementiert –

Antwort

7

Was Sie dort brauchen, ist Dialog mit Liste innerhalb zu zeigen. So ähnlich:

itemView.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View view) { 
      final CharSequence[] items = {"Supprimer", "etc", "etc1"}; 

      AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 

      builder.setTitle("Select The Action"); 
      builder.setItems(items, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int item) { 
       } 
      }); 
      builder.show(); 
      return true; 
     } 
    }); 
+0

Also keine Notwendigkeit, ContextMenu und zugehörige Methoden zu registrieren? Diese Lösung könnte tatsächlich den Trick machen, selbst wenn ich das Kontextmenü ausprobieren wollte. – Isabelle

+0

Keine Notwendigkeit, zumindest das letzte Mal, als ich mit Kontext-Menü etwas vor 3 Jahren arbeitete, und ich denke nicht, dass es nützlich ist. – Divers

+0

Ich entschied mich schließlich für Ihre Lösung, die nur die einfachste Art ist, das zu implementieren, was ich tun wollte. Vielen Dank! – Isabelle

0

Edit 1: speziell Dialog anzuzeigen, verwenden

openContextMenu(v); 

Dabei steht v für die Ansicht. und

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
           ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.context_menu,menu); 
} 
@Override 
public boolean onContextItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
     default: 
      return super.onContextItemSelected(item); 
    } 
} 

Der Code in context_menu Datei im Menüordner sollte wie folgt aussehen:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="com.example.MainActivity"> 

    <item 
     android:id="@+id/item" 
     android:orderInCategory="200" 
     android:title="Item" 
     android:icon="@drawable/faq" 
     app:showAsAction="ifRoom" 
     ></item> 
</menu> 

In der Vergangenheit war ich auch mit ein paar Probleme mit RecyclerView der onClickListener und onLongClickListener. Also hier ist das, was ich bin mit:

public class ItemClickSupport { 
    private final RecyclerView mRecyclerView; 
    private OnItemClickListener mOnItemClickListener; 
    private OnItemLongClickListener mOnItemLongClickListener; 
    private View.OnClickListener mOnClickListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (mOnItemClickListener != null) { 
       RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v); 
       mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v); 
      } 
     } 
    }; 
    private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      if (mOnItemLongClickListener != null) { 
       RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v); 
       return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v); 
      } 
      return false; 
     } 
    }; 
    private RecyclerView.OnChildAttachStateChangeListener mAttachListener 
      = new RecyclerView.OnChildAttachStateChangeListener() { 
     @Override 
     public void onChildViewAttachedToWindow(View view) { 
      if (mOnItemClickListener != null) { 
       view.setOnClickListener(mOnClickListener); 
      } 
      if (mOnItemLongClickListener != null) { 
       view.setOnLongClickListener(mOnLongClickListener); 
      } 
     } 

     @Override 
     public void onChildViewDetachedFromWindow(View view) { 

     } 
    }; 

    private ItemClickSupport(RecyclerView recyclerView) { 
     mRecyclerView = recyclerView; 
     mRecyclerView.setTag(R.id.item_click_support, this); 
     mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener); 
    } 

    public static ItemClickSupport addTo(RecyclerView view) { 
     ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support); 
     if (support == null) { 
      support = new ItemClickSupport(view); 
     } 
     return support; 
    } 

    public static ItemClickSupport removeFrom(RecyclerView view) { 
     ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support); 
     if (support != null) { 
      support.detach(view); 
     } 
     return support; 
    } 

    public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) { 
     mOnItemClickListener = listener; 
     return this; 
    } 

    public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) { 
     mOnItemLongClickListener = listener; 
     return this; 
    } 

    private void detach(RecyclerView view) { 
     view.removeOnChildAttachStateChangeListener(mAttachListener); 
     view.setTag(R.id.item_click_support, null); 
    } 

    public interface OnItemClickListener { 

     void onItemClicked(RecyclerView recyclerView, int position, View v); 
    } 

    public interface OnItemLongClickListener { 

     boolean onItemLongClicked(RecyclerView recyclerView, int position, View v); 
    } 
} 

und dann in der Tätigkeit, verwenden Sie die folgenden Schritte aus:

ItemClickSupport.addTo(recyclerView).setOnItemLongClickListener(new ItemClickSupport.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClicked(RecyclerView recyclerView, int position, View v) { 

       return true; 
      } 
    }); 

Verwendung position Artikel angeben. Ich hoffe es hilft!