RecyclerView için bağlam menüsü nasıl oluşturulur


100

RecyclerView?Görünüşe göre arama registerForContextMenu(recyclerView)çalışmıyor için bağlam menüsünü nasıl uygularım . Onu bir parçadan çağırıyorum. Bunu uygulayan var mı?


Ben aynı gemideyim. AdapterContextMenuInfo ile çeşitli ListView değerlendirmelerini denedim - ancak bilgi konumunu alamıyorum
RoundSparrow hilltx

Sanırım bağlam menüsü günleri bitti.
Binoy Babu

4
Hey - Çalışmaya başladım;) refeerence: stackoverflow.com/questions/2321332/… - ViewHolder benim için onClick dinleyicisi - ben de OnCreateContextMenuListener yaptım. Tüm bunların anahtarı, bir seferde yalnızca BİR Menünün açılabileceğini fark ettim - bu nedenle bağdaştırıcının, menünün tıklandığı son RecyclerView listesi öğesinin hangisi olduğu bir int'e ihtiyacı var ... daha sonra Parça / Etkinlik olabilir gerçek menü öğesi tıklaması geldiğinde adaptöre sorun.
RoundSparrow hilltx

Yanıtlar:


94

RecycleView android.view.ViewGroup'u genişlettiği için onClickListener , OnContextMenuListener vb. Gibi bu yöntemleri doğrudan uygulayamazsınız . Dolayısıyla bu yöntemi doğrudan kullanamayız. Bu yöntemleri ViewHolder adaptör sınıfında uygulayabiliriz . RecycleView'da bağlam menüsünü şu şekilde kullanabiliriz:

public static class ViewHolder extends RecyclerView.ViewHolder implements OnCreateContextMenuListener {

    TextView tvTitle;
    ImageView ivImage;

    public ViewHolder(View v) {
        super(v);
        tvTitle =(TextView)v.findViewById(R.id.item_title);
        v.setOnCreateContextMenuListener(this);


    }

Şimdi bağlam menüsünü uygularken aynı prosedürü takip ediyoruz.

@Override
public void onCreateContextMenu(ContextMenu menu, View v, 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"); 

}

Herhangi bir zorluk yaşarsanız yorumda sorun.


7
Tamam, ardından bir onContextItemSelectedetkinlik / parça düzeyinde uyguluyoruz . getTitleçalışır, getItemIdçalışır, ancak getMenuInfoboş verir. Peki, nasıl ulaşılır ViewHolder?
Michael Schmidt

@MichaelSchmidt, İçerik menüsü bilgilerini uyguladığınız kodunuzu bana gösterebilir.
Prabhakar

7
Biraz denedikten sonra bunun da çalışmasını sağlayamıyorum, getMenuInfo()null girişi veriyor onContextItemSelected(). Belki de işe yarayan insanlar onCreateContextMenu(), hiyerarşinin ( RecyclerViewveya Fragment) daha yukarılara bakan bir bakış açısına sahip bir yönteme sahiptir ? Bu işe yarayabilir ama sonra bizi bu sorunun başka yanıtlarına götürür.
Neils

3
Prabhakbar tıklanan öğeyi nasıl elde edeceğinizi de söylemediniz mi?
Benjamin Stürmer

6
menu.add(this.getAdapterPosition(), v.getId(), 0, "Call");item.getGroupId()
Görevi

102

Bilgi ve yorumlar için teşekkürler. İçindeki ContextMenuöğeler için başardım Recyclerview.

İşte yaptığım şey

Fragment onViewCreatedyönteminde veya Activity onCreateyönteminde:

registerForContextMenu(mRecyclerView);

Sonra Adaptörde ekle

private int position;

public int getPosition() {
    return position;
}

public void setPosition(int position) {
    this.position = position;
}

ViewHoldersınıfın uygulanmasını sağlayınOnCreateContextMenuListener

public static class ViewHolder extends RecyclerView.ViewHolder 
        implements View.OnCreateContextMenuListener {

    public ImageView icon;

    public TextView fileName;
    public ImageButton menuButton;


    public ViewHolder(View v) {
        super(v);
        icon = (ImageView)v.findViewById(R.id.file_icon);
        fileName = (TextView)v.findViewById(R.id.file_name);
        menuButton = (ImageButton)v.findViewById(R.id.menu_button);
        v.setOnCreateContextMenuListener(this);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, 
        ContextMenu.ContextMenuInfo menuInfo) {
        //menuInfo is null
        menu.add(Menu.NONE, R.id.ctx_menu_remove_backup, 
            Menu.NONE, R.string.remove_backup);
        menu.add(Menu.NONE, R.id.ctx_menu_restore_backup,
            Menu.NONE, R.string.restore_backup);
    }
}

onBindViewHolderOnLongClickListenerbağlam menüsü yüklenmeden önce konumu yakalamak için tutucu.itemView öğesine yöntem ekleyin :

holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        setPosition(holder.getPosition());
        return false;
    }
});

Ardından, onViewRecycledreferans sorunu olmaması için Dinleyiciyi kaldırın. (gerekli olmayabilir).

@Override
public void onViewRecycled(ViewHolder holder) {
    holder.itemView.setOnLongClickListener(null);
    super.onViewRecycled(holder);
}

Son olarak, Fragment / Activity'de aşağıdaki onContextItemSelectedgibi geçersiz kıl :

@Override
public boolean onContextItemSelected(MenuItem item) {
    int position = -1;
    try {
        position = ((BackupRestoreListAdapter)getAdapter()).getPosition();
    } catch (Exception e) {
        Log.d(TAG, e.getLocalizedMessage(), e);
        return super.onContextItemSelected(item);
    }
    switch (item.getItemId()) {
        case R.id.ctx_menu_remove_backup:
            // do your stuff
            break;
        case R.id.ctx_menu_restore_backup:
            // do your stuff
            break;
    }
    return super.onContextItemSelected(item);
}

1
position = ((BackupRestoreListAdapter) getAdapter ()). getPosition (); -> hata al: getAdapter () yöntemi ... türü için tanımsız, getAdapter yöntemini gösterebilir misiniz
nguoixanh

1
Harika bir öneri, teşekkürler. Önemsiz: viewHolder.getPosition () kullanımdan kaldırıldı. İyileştirme için tavsiyeniz nedir?
tm1701

10
viewHolder.getAdapterPosition () yerine GetPosition () kullanın
Sagar Chavada

2
GetAdapter () hatasını alanlar için, RecyclerView'uma bir başvuru kaydederek ve ardından şu şekilde kullanarak çözdüm: ((BackupRestoreListAdapter) recyclerView.getAdapter ()). GetPosition ();
Kevin Amorim

1
Ve R.id.ctx_menu_remove_backup tam olarak nerede?
akubi

29

Mevcut cevap doğru değil. İşte çalışan bir uygulama:

public class ContextMenuRecyclerView extends RecyclerView {

  private RecyclerViewContextMenuInfo mContextMenuInfo;

  @Override
  protected ContextMenu.ContextMenuInfo getContextMenuInfo() {
    return mContextMenuInfo;
  }

  @Override
  public boolean showContextMenuForChild(View originalView) {
    final int longPressPosition = getChildPosition(originalView);
    if (longPressPosition >= 0) {
        final long longPressId = getAdapter().getItemId(longPressPosition);
        mContextMenuInfo = new RecyclerViewContextMenuInfo(longPressPosition, longPressId);
        return super.showContextMenuForChild(originalView);
    }
    return false;
  }

  public static class RecyclerViewContextMenuInfo implements ContextMenu.ContextMenuInfo {

    public RecyclerViewContextMenuInfo(int position, long id) {
        this.position = position;
        this.id = id;
    }

    final public int position;
    final public long id;
  }
}

Parçanızda (veya Aktivitenizde):

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mRecyclerView = view.findViewById(R.id.recyclerview);
    registerForContextMenu(mRecyclerView);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    // inflate menu
    MenuInflater inflater = getActivity().getMenuInflater();
    inflater.inflate(R.menu.my_context_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    return super.onContextItemSelected(item);
    RecyclerViewContextMenuInfo info = (RecyclerViewContextMenuInfo) item.getMenuInfo();
    // handle menu item here
}

Ve son olarak, ViewHolder'ınızda:

class MyViewHolder extends RecyclerView.View.ViewHolder {
    ...
    private void onLongClick() {
        itemView.showContextMenu();
    }
}

Lütfen, ContextMenuRecyclerView üzerinde uygulamak zorunda olduğunuz RecyclerView yapıcısını ekleyin. Ve ayrıca getChildPosition()artık kullanımdan kaldırıldı. Onun getChildAdapterPosition()yerine kullandım .
Juan José Melero Gómez

1
Not: Üzgünüm, eklemeyi unuttum: getChildPosition()kullanımdan kaldırıldı com.android.support:recyclerview-v7:22.0.0.
Juan José Melero Gómez

1
bu çalışmıyor. RecyclerView.View.ViewHolder'dan getView (). showContextMenu () öğesine erişemezsiniz.
Mulgard

4
Bu benim için çalışıyor. Ancak MyViewHolder'da onLongClick () 'e sahip olmaya gerek yoktur, yapıcıda itemView.setLongClickable (true)' yi ayarlamak yeterlidir, OnLongClickListener kayıtlı olmadığında bağlam menüsü görünecektir.
alders

2
Ayrıca önemli: RecyclerView’i ContextMenuRecyclerView’a genişletirken, IDE’nin önerdiği İNŞAATÖRLERİ EKLEMEYİ unutmayın. Özellikle, Context ve AttributeSet alan iki bağımsız değişkenli yapıcıyı uygulamazsanız, Android düzen XML'nizi şişiremez.
lidkxx

24

Bunu ViewrecycleView'daki bir öğe için deneyin

.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            menu.add("delete").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {

                    //do what u want
                    return true;
                }
            });
        }
    });

Bir ViewHolderöğeye veri ayarlayarak kullanabilirsiniz


Tam olarak geri dönüştürülmüş bir görünümdeki bir resim görünümündeki bağlam menüsü için ihtiyacım olan şey
Themos

2
Şimdi buna bakan herkes için, bu yalnızca API 23 ve üzeri sürümlerde çalışır.
SWoo

16

Prabhakar cevabı doğru, ancak bir içerik menüsü öğesi seçildiğinde, basılan öğeyle ilgili bir verinin nasıl alınacağını açıklamadı. onContextItemSelectedGeri aramayı kullanabiliriz , ancak bu durumda () ContextMenuInfokullanılamaz null(eğer getContextMenuInfo()yöntem basılı bir görünüm için geçersiz kılınmamışsa). Yani, en basit çözüm, OnMenuItemClickListenerdoğrudan MenuItem.

private class ViewHolder extends RecyclerView.ViewHolder {
    private final TextView mTitleTextView;
    private MyItemData mData;

    public ViewHolder(View view) {
        super(view);

        mTitleTextView = (TextView)view.findViewById(R.id.title);

        view.setOnCreateContextMenuListener(mOnCreateContextMenuListener);
    }

    public void bind(@NonNull MyItemData data) {
         mData = data;

         String title = mData.getTitle();
         mTitleTextView.setText(title);
    }

    private final View.OnCreateContextMenuListener mOnCreateContextMenuListener = new View.OnCreateContextMenuListener() {
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            if (mData!= null) {
                MenuItem myActionItem = menu.add("My Context Action");
                myActionItem.setOnMenuItemClickListener(mOnMyActionClickListener);
            }
        }
    };

    private final MenuItem.OnMenuItemClickListener mOnMyActionClickListener = new MenuItem.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            //todo: process item click, mData is available here!!!
            return true;
        }
    };
}

1
Kod pasajınızın ne yaptığını ve nasıl yaptığını açıkça açıklayın. Değerli olsa bile yalnızca kopyalanarak yapıştırılan bir kod yeterli değildir.
peterh - Monica'yı eski durumuna getir

Parçanın / etkinliğin tıklamaları işlemesine izin vermek kadar verimli olmasa bile , RecyclerViewyalnızca geçersiz kılmak getContextMenuInfovb. Özel alt sınıflar oluşturmak istemiyorsanız, bu makul bir uzlaşma gibi görünmektedir . Dinleyiciler, tutucudaki verilere erişebilecek, bu nedenle pozisyona ihtiyacınız olmayacak. Ve teorik olarak, yine de bağdaştırıcınızda bağlanma üzerine konumu önbelleğe alabilir ve gerekirse, sahibinizi aramak için yetkilendirmeyi kullanabilirsiniz, ancak Contextbağlı görünümlerden birini kullanmak bazen yeterli olabilir.
qix

10

@ Renaud'un cevabı benim için çalıştı ancak önce birkaç kod düzeltmesi gerekiyordu. Kodunun birkaç farklı yinelemesinden parçacıklar yayınlamış gibi. Yapılması gereken değişiklikler şunlardır:

  • RecyclerContextMenuInfove RecyclerViewContextMenuInfoaynı sınıftır. Bir isim seçin ve ona bağlı kalın.
  • ViewHolderUygulamalıdır View.OnLongClickListenerve aramayı unutma setOnLongClickListener()yapıcısındaki öğe üzerinde.
  • In onLongClick()dinleyici, getView().showContextMenu()tamamen yanlıştır. Sen çağırmalıdır showContextMenuForChild()Gözlerinde farklı ContextMenuRecyclerViewaksi takdirde ContextMenuInfosen almak onCreateContextMenu()ve onContextItemSelected()boş olacaktır.

Aşağıda düzenlediğim kod:

ContextMenuRecyclerView:

public class ContextMenuRecyclerView extends RecyclerView {

    private RecyclerViewContextMenuInfo mContextMenuInfo;

    @Override
    protected ContextMenu.ContextMenuInfo getContextMenuInfo() {
        return mContextMenuInfo;
    }

    @Override
    public boolean showContextMenuForChild(View originalView) {
        final int longPressPosition = getChildPosition(originalView);
        if (longPressPosition >= 0) {
            final long longPressId = getAdapter().getItemId(longPressPosition);
                mContextMenuInfo = new RecyclerViewContextMenuInfo(longPressPosition, longPressId);
            return super.showContextMenuForChild(originalView);
        }
        return false;
    }

    public static class RecyclerViewContextMenuInfo implements ContextMenu.ContextMenuInfo {

        public RecyclerViewContextMenuInfo(int position, long id) {
            this.position = position;
            this.id = id;
        }

        final public int position;
        final public long id;
    }
}

Parçanızda:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mRecyclerView = view.findViewById(R.id.recyclerview);
    registerForContextMenu(mRecyclerView);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    // inflate menu here
    // If you want the position of the item for which we're creating the context menu (perhaps to add a header or something):
    int itemIndex = ((ContextMenuRecyclerView.RecyclerViewContextMenuInfo) menuInfo).position;
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    ContextMenuRecyclerView.RecyclerViewContextMenuInfo info = (ContextMenuRecyclerView.RecyclerViewContextMenuInfo) item.getMenuInfo();
    // handle menu here - get item index or ID from info
    return super.onContextItemSelected(item);
}

ViewHolder'ınızda:

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener {

    public MyViewHolder( View itemView ) {
        super( itemView );
        itemView.setOnLongClickListener( this );
    }

    @Override public boolean onLongClick() {
        recyclerView.showContextMenuForChild( v );
        return true;
    }
}

Ayrıca, düzeninizde RecyclerViewile değiştirdiğinizden emin olun ContextMenuRecyclerView!


1
Yazım hataları beni işaret için josh2112 @ teşekkürler, ben sadece onları düzelttim - AMA son noktayı ilişkin, sen yerini alabilir recyclerView.showContextMenuForChild(itemView);tarafından itemView.showContextMenu().
Renaud Cerrato

1
Ayrıca önemli: RecyclerView’i ContextMenuRecyclerView’a genişletirken, IDE’nin önerdiği İNŞAATÖRLERİ EKLEMEYİ unutmayın. Özellikle, Context ve AttributeSet alan iki bağımsız değişkenli yapıcıyı uygulamazsanız, Android düzen XML'nizi şişiremez.
lidkxx

7

RecyclerView öğelerinde menü içeriğini kullanmanın temiz bir yolu

İlk önce bir eşya pozisyonuna ihtiyacınız var

Adaptör sınıfında:

 /**
 * Custom on long click item listener.
 */
onLongItemClickListener mOnLongItemClickListener;

public void setOnLongItemClickListener(onLongItemClickListener onLongItemClickListener) {
    mOnLongItemClickListener = onLongItemClickListener;
}

public interface onLongItemClickListener {
    void ItemLongClicked(View v, int position);
}

Gelen onBindViewHolderözel dinleyicisi kanca:

        // Hook our custom on long click item listener to the item view.
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (mOnLongItemClickListener != null) {
                    mOnLongItemClickListener.ItemLongClicked(v, position);
                }

                return true;
            }
        });

MainActivity'de (Etkinlik / Parça) bir alan oluşturun:

private int mCurrentItemPosition;

Bağdaştırıcı nesnenizde özel dinleyiciyi ayarlayın:

    mAdapter.setOnLongItemClickListener(new FileAdapter.onLongItemClickListener() {
        @Override
        public void ItemLongClicked(View v, int position) {
            mCurrentItemPosition = position;
        }
    });

Artık üzerine uzun süre tıkladığınız herhangi bir öğe için nefis bir konumunuz var 😋

İkincisi, menünüzü oluşturun

Res -> menüsünde Menü öğenizi içeren bir dosya oluşturun context_menu_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/delete" android:title="Delete"/>
<item android:id="@+id/share" android:title="Share"/>
</menu>

MainActivity'de: Her ikisini de uygulayın onCreateContextMenuve onContextItemSelected:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu_main, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.delete) {

    }

    if (id == R.id.share) {

    }

    return true;
}

Üçüncüsü, Adapter nesnenize geri dönün

  1. Bağlam menünüzü kaydedin.
  2. bağlam menüsünü gösterin.

    registerForContextMenu(mRecyclerView);
    mAdapter.setOnLongItemClickListener(new FileAdapter.onLongItemClickListener() {
        @Override
        public void ItemLongClicked(View v, int position) {
            mCurrentItemPosition = position;
            v.showContextMenu();
        }
    });
    

Umarım hiçbir şeyi unutmam 🤔

Menüler Belgelerinde daha fazla bilgi


Teşekkürler! Veriler bağlam menüsüne nasıl aktarılır? Örneğin, öğe kimliği, öğe metni vb.
CoolMind

4

İşte benim için çalışan Kotlin ile bunu yapmanın daha basit bir yolu. En büyük zorluk, basılan öğenin konumunu bulmaktır. Adaptörünüzün içine bu kod parçacığını yerleştirebilirsiniz ve içerik menüsünün gösterildiği öğenin konumunu yakalayabilir; bu kadar.

override fun onBindViewHolder(holder: YourViewHolder, position: Int) {

...     

    holder.view.setOnCreateContextMenuListener { contextMenu, _, _ -> 
            contextMenu.add("Add").setOnMenuItemClickListener {
                    longToast("I'm pressed for the item at position => $position")
                    true    
            }       
    }       

} 

2
Bunu yapmanın en doğal ve kontrol edilebilir yolu bu
nima

3

Partiye geç kalmış olabilirim ama işe yarayan bir çözümüm var . Bunun için bir fikir verdim.

RecyclerView'a Bağlam Menüsü Ekleme

ActivityName.java

//Import Statements

public class ActivityName extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_birthdays);


        //Recycle View
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        mLayoutManager = new LinearLayoutManager(getApplicationContext());
        mRecyclerView.setLayoutManager(mLayoutManager);
        mAdapter = new BirthdaysListAdapter(data, this);
        mRecyclerView.setAdapter(mAdapter);


    }

RecyclerAdapter.java

//Import Statements


public class BirthdaysListAdapter extends RecyclerView.Adapter<BirthdaysListAdapter.ViewHolder> {
    static Context ctx;

    private List<typeOfData> Data;


    public BirthdaysListAdapter(List<typeOfData> list, Context context) {
        Data = list;
        this.ctx = context;

    }

    BirthdaysListAdapter() {
    }

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
        public TextView name;
        public TextView Birthday;
        public ImageView colorAlphabet;
        public TextView textInImg;


        public ViewHolder(View v) {
            super(v);
            name = (TextView) v.findViewById(R.id.name);
            Birthday = (TextView) v.findViewById(R.id.Birthday);
            colorAlphabet = (ImageView) v.findViewById(R.id.colorAlphabet);
            textInImg = (TextView) v.findViewById(R.id.textInImg);


            v.setOnCreateContextMenuListener(this); //REGISTER ONCREATE MENU LISTENER
        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v                         //CREATE MENU BY THIS METHOD
                                        ContextMenu.ContextMenuInfo menuInfo) {
            new BirthdaysListAdapter().info = (AdapterView.AdapterContextMenuInfo) menuInfo;
            MenuItem Edit = menu.add(Menu.NONE, 1, 1, "Edit");
            MenuItem Delete = menu.add(Menu.NONE, 2, 2, "Delete");
            Edit.setOnMenuItemClickListener(onEditMenu);
            Delete.setOnMenuItemClickListener(onEditMenu);


        }
//ADD AN ONMENUITEM LISTENER TO EXECUTE COMMANDS ONCLICK OF CONTEXT MENU TASK
        private final MenuItem.OnMenuItemClickListener onEditMenu = new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {


                DBHandler dbHandler = new DBHandler(ctx);
                List<WishMen> data = dbHandler.getWishmen();

                switch (item.getItemId()) {
                    case 1:
                        //Do stuff
                        break;

                    case 2:
                       //Do stuff

                        break;
                }
                return true;
            }
        };


    }


    public List<ViewBirthdayModel> getData() {
        return Data;
    }


    @Override
    public long getItemId(int position) {

        return super.getItemId(position);
    }


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

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.name.setText(Data.get(position).getMan().getName());
        holder.Birthday.setText(Data.get(position).getMan().getBday());
        holder.colorAlphabet.setBackgroundColor(Color.parseColor(Data.get(position).getColor()));
        holder.textInImg.setText(String.valueOf(Data.get(position).getMan().getName().toUpperCase().charAt(0)));
           }


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

    private int position;

    public int getPosition() {

        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

}

3

Çözümümü @ Hardik Shah'ın çözümüyle birleştirdim:

Aktivitede var:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    if (v.getId() == R.id.rvQuests) {
        getMenuInflater().inflate(R.menu.list_menu, menu);
    }
}

Adaptörde var:

private MainActivity context;
private int position;

public int getPosition() {
    return position;
}

public void setPosition(int position) {
    this.position = position;
}

public QuestsAdapter(MainActivity context, List<Quest> objects) {
    this.context = context;
    this.quests.addAll(objects);
}

public class QuestViewHolder extends RecyclerView.ViewHolder {
    private QuestItemBinding questItemBinding;

    public QuestViewHolder(View v) {
        super(v);
        questItemBinding = DataBindingUtil.bind(v);
        v.setOnCreateContextMenuListener(context);
    }
}

@Override
public void onBindViewHolder(final QuestViewHolder holder, int position) {
    Quest quest = quests.get(position);
    holder.questItemBinding.setQuest(quest);
    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            setPosition(holder.getAdapterPosition());
            return false;
        }
    });
}

@Override
public void onViewRecycled(QuestViewHolder holder) {
    holder.itemView.setOnLongClickListener(null);
    super.onViewRecycled(holder);
}

Parçada var:

@Override
public boolean onContextItemSelected(MenuItem item) {
    int position = ((QuestsAdapter) questsList.getAdapter()).getPosition();
    switch (item.getItemId()) {
        case R.id.menu_delete:
            Quest quest = questsAdapter.getItem(position);
            App.getQuestManager().deleteQuest(quest);
            questsAdapter.remove(quest);
            checkEmptyList();
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

2

Ararken ürün kimliğini almak isteyenler için bir çözüm ContextMenu.

Buna RecyclerViewbenzer öğelere sahipseniz (tıklanabilir içeren ImageView):

liste

o zaman sizi geri aramalısınız onClickListener.

Adaptör

class YourAdapter(private val contextMenuCallback: ContextMenuCallback) :
    RecyclerView.Adapter<YourAdapter.ViewHolder>() {

    private var items: MutableList<Item> = mutableListOf()

    ...

    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
        val item = items[position] as Item
        updateItem(viewHolder, item)

        setOnClickListener(viewHolder.itemView, items[position].id, items[position].title)
    }

    private fun setOnClickListener(view: View, id: Int, title: String) {
//        view.setOnClickListener { v ->  }
        // A click listener for ImageView `more`.
        view.more.setOnClickListener {
            // Here we pass item id, title, etc. to Fragment.
            contextMenuCallback.onContextMenuClick(view, id, title)
        }
    }


    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val titleTextView: TextView = itemView.title
    }

    class Item(
        val id: Int,
        val title: String
    )

    interface ContextMenuCallback {
        fun onContextMenuClick(view: View, id: Int, title: String)
    }
}

Fragman

class YourFragment : Fragment(), YourAdapter.ContextMenuCallback {

    private var adapter: YourAdapter? = null
    private var linearLayoutManager: LinearLayoutManager? = null
    private var selectedItemId: Int = -1
    private lateinit var selectedItemTitle: String


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        adapter = YourAdapter(this)
        view.recycler_view.apply {
            layoutManager = linearLayoutManager
            adapter = this@YourFragment.adapter
            setHasFixedSize(true)
        }

        registerForContextMenu(view.recycler_view)
    }

    override fun onCreateContextMenu(menu: ContextMenu?, v: View?,
                                     menuInfo: ContextMenu.ContextMenuInfo?) {
        activity?.menuInflater?.inflate(R.menu.menu_yours, menu)
    }

    override fun onContextItemSelected(item: MenuItem?): Boolean {
        super.onContextItemSelected(item)
        when (item?.itemId) {
            R.id.action_your -> yourAction(selectedItemId, selectedItemTitle)
            ...
        }
        return true
    }

    override fun onContextMenuClick(view: View, id: Int, title: String) {
        // Here we accept item id, title from adapter and show context menu.
        selectedItemId = id
        selectedItemTitle = title
        view.showContextMenu()
    }
}

Uyarı!

Bir ViewPagerparçayı temel alan bir kullanırsanız (tüm sayfalar benzer listelerdir), bir sorunla karşılaşırsınız. onContextItemSelectedHangi menü öğesinin seçildiğini anlamak için geçersiz kıldığınızda , ilk sayfadan bir liste öğesi kimliği alırsınız! Bu sorunun üstesinden gelmek için ViewPager'daki Yanlış parça, onContextItemSelected çağrısını alıyor konusuna bakın .


1

Merhaba arkadaşlar benim için çalışan bir alternatifle çıktı. ViewHolder Constructor'da, itemView'umu registerContextMenu ile kaydettiriyorum, ayrıca aynı Görünüme bir onLongClikcListener ayarlıyorum. OnLongClick (View v) uygulamasında, basitçe getLayoutPosition () ile tıklanan konumu elde ediyorum ve bir örnek değişkenine kaydediyorum (ContextMenuInfo'nun çalışması beklendiği gibi bu verileri temsil edecek bir sınıf oluşturdum), ancak daha önemli Bu yöntemde yanlış döndürdüğünüzden emin olun . Artık tek yapmanız gereken onContextItemSelected (MenuItem öğesi) üzerinde sizin içinizde, örnek değişkeninizde sakladığınız verileri okuyun ve geçerliyse eylemlerinize devam edin. İşte bir pasaj.

  public MyViewHolder(View itemView){
super(itemView);
registerForContextMenu(itemView);
itemView.setOnLongClickListener(this);
}

ViewHolder'ın OnLongClickListener uygulamasını yapmasını sağlıyorum, ancak bunu istediğiniz şekilde yapabilirsiniz.

@Override
public boolean onLongClick(View v){
    mCurrentLongItem = new ListItemInfo(v.getId(), getLayoutPosition());
    return false; // REMEMBER TO RETURN FALSE.
  }

Bunu ayrıca adaptörde veya ViewHolder'da sahip olduğunuz başka bir Görünüme (yani bir TextView) ayarlayabilirsiniz. Önemli olan, onLongClik () uygulamasıdır.

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.client_edit_context_menu:
            if(mCurrentLongItem != null){
                 int position = mCurrentLongItem.position;
                //TAKE SOME ACTIONS.
                mCurrentLongItem = null;
            }
            return true;
    }
    return super.onContextItemSelected(item);
}

En iyi yanı, LongClick olayını hala istediğiniz durumlarda true olarak geri döndürebiliyor olmanız ve conextMenu'nun görünmemesidir.

Bu yöntem çalışır çünkü registerForContextView View LongClickable yapar ve ContextMenu'yu işleme zamanı geldiğinde, sistem performLongClick'i çağırır, bu ilk olarak bir onLongClick uygulamasını çağırır ve eğer yanlış dönerse, showContextMenu'yu çağırır.


1

Bu çözümü bir süredir kullanıyorum ve benim için oldukça iyi çalıştı.

public class CUSTOMVIEWNAME extends RecyclerView { 

public CUSTOMVIEWNAME(Context context) {
    super(context);
}

public CUSTOMVIEWNAME (Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CUSTOMVIEWNAME (Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

private RecyclerContextMenuInfo mContextMenuInfo;

@Override
protected ContextMenu.ContextMenuInfo getContextMenuInfo() {
    return mContextMenuInfo;
}

@Override
public boolean showContextMenuForChild(View originalView) {
    final int longPressPosition = getChildAdapterPosition(originalView);
    if (longPressPosition >= 0) {
        final long longPressId = getAdapter().getItemId(longPressPosition);
        mContextMenuInfo = new RecyclerContextMenuInfo(longPressPosition,    `           longPressId);
        return super.showContextMenuForChild(originalView);
    }
    return false;
}

public class RecyclerContextMenuInfo implements ContextMenu.ContextMenuInfo             {

    public RecyclerContextMenuInfo(int position, long id) {
        this.position = position;
        this.id = id;
    }

    final public int position;
    final public long id;
}
}

Şimdi parçanızda veya Aktivitenizde aşağıdaki yöntemleri uygulayın.

  @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    // Inflate Menu from xml resource
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.context_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    ContextMenuRecyclerView.RecyclerContextMenuInfo info = (ContextMenuRecyclerView.RecyclerContextMenuInfo) item.getMenuInfo();
    Toast.makeText(InstanceOfContext , " User selected  " + info.position, Toast.LENGTH_LONG).show();

    return false;
}

Son olarak geri dönüşümcü görünümünde bağlam menüsü için kaydolun

   //for showing a popup on LongClick of items in recycler.
    registerForContextMenu(recyclerView);

Bu işe yaramalı!


1

RecyclerView için bağlam menüsünü nasıl uygulayabileceğiniz ve bağlam menüsü öğesi seçili olan öğenin konumunu nasıl elde edeceğiniz aşağıda açıklanmıştır:

public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> {

... 

@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int position) {

    ...

    viewHolder.itemView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            menu.add(0, R.id.mi_context_disable, 0, R.string.text_disable)
                    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            // can do something with item at position given below,
                            // viewHolder is final
                            viewHolder.getAdapterPosition();
                            return true;
                        }
                    });
            menu.add(0, R.id.mi_context_remove, 1, R.string.text_remove)
                    .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {                                
                            // can do something with item at position given below,
                            // viewHolder is final
                            viewHolder.getAdapterPosition();
                            return true;
                        }
                    });
        }
    });
}

static class ViewHolder extends RecyclerView.ViewHolder {
    private View itemView;

    private ViewHolder(@NonNull View itemView) {
        super(itemView);
        this.itemView = itemView;
    }
}

}


0

Bu konuda mücadele ediyorum çünkü Android bunu benim için ListView için çok iyi çalışan RecyclerView'da iyi bir şekilde işlemiyor.

En zor parça, ContextMenuInfo parçasının, Görünümü geçersiz kılmaktan başka kolayca ekleyemeyeceğiniz bir Görünümün içine gömülü olmasıdır.

Bu nedenle, faaliyete konum bilgisini iletmenize yardımcı olacak bir paketleyiciye ihtiyacınız olacak.

public class RecyclerContextMenuInfoWrapperView extends FrameLayout {
private RecyclerView.ViewHolder mHolder;
private final View mView;

public RecyclerContextMenuInfoWrapperView(View view) {
    super(view.getContext());
    setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    mView = view;
    addView(mView);
}

public void setHolder(RecyclerView.ViewHolder holder) {
    mHolder = holder;
}

@Override
protected ContextMenu.ContextMenuInfo getContextMenuInfo() {
    return new RecyclerContextMenuInfo(mHolder.getPosition(), mHolder.getItemId());
}

public static class RecyclerContextMenuInfo implements ContextMenu.ContextMenuInfo {

    public RecyclerContextMenuInfo(int position, long id) {
        this.position = position;
        this.id = id;
    }

    final public int position;
    final public long id;
}

}

Sonra RecyclerAdapter içinde, ViewHolders oluşturduğunuzda, Sarmalayıcıyı kök görünüm olarak ayarlamanız ve her görünümde bağlam Menüsünü kaydetmeniz gerekir.

public static class AdapterViewHolder extends RecyclerView.ViewHolder {
    public AdapterViewHolder(  View originalView) {
        super(new RecyclerContextMenuInfoWrapperView(originalView);
        ((RecyclerContextMenuInfoWrapperView)itemView).setHolder(this);
        yourActivity.registerForContextMenu(itemView);
        itemView.setOnCreateContextMenuListener(yourListener);
    }

}

Son olarak, Aktivitenizde, genellikle yaptığınız şeyi yapabileceksiniz:

@Override
public boolean onContextItemSelected(MenuItem item) {
    int position = ((RecyclerContextMenuInfoWrapperView.RecyclerContextMenuInfo)item.getMenuInfo()).position;
    // do whatever you need as now you have access to position and id and everything

0

En iyisi, geri dönüşümlü görünümde Bağlam menüsünü kullanmaktı, özel bir geri dönüşümcü görünümü oluşturup getContextMenuInfo()yöntemi geçersiz kılarsanız ve kendi bağlam menüsü bilgi nesnesi örneğinizi döndürürseniz, böylece oluşturulduktan sonra ve menü tıklandığında konumları getirebilirsiniz:

@Override
protected ContextMenu.ContextMenuInfo getContextMenuInfo() {
    return mContextMenuInfo;
}

Oluşturduğum şu ana bir göz atın:

https://gist.github.com/resengupta/2b2e26c949b28f8973e5


0

Bazı cevapları biraz daha genişleterek, Adaptör / ViewHolder'daki kodunuzdaki menüyü manuel olarak tanımlamaktan kaçınmak istiyorsanız, bir PopupMenu kullanabilir ve menü seçeneklerini standart bir menu.xml kaynak dosyasından şişirebilirsiniz.

Aşağıdaki örnek, içerik menüsü tıklamalarına yanıt vermek için Parça / Aktivitenizde uygulayabileceğiniz bir dinleyiciyi geçirme yeteneği dahil bunu göstermektedir.

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {

private List<CustomObject> objects;
private OnItemSelectedListener listener;
private final boolean withContextMenu;

class ViewHolder extends RecyclerView.ViewHolder
        implements View.OnClickListener, View.OnCreateContextMenuListener, PopupMenu.OnMenuItemClickListener {

    @BindView(R.id.custom_name)
    TextView name;

    @BindView(R.id.custom_value)
    TextView value;

    ViewHolder(View view) {
        super(view);
        ButterKnife.bind(this, view);
        view.setOnClickListener(this);
        if (withContextMenu) {
            view.setOnCreateContextMenuListener(this);
        }
    }

    @Override
    public void onClick(View v) {
        int position = getAdapterPosition();
        if (listener != null) {
            listener.onCustomerSelected(objects.get(position));
        }
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        PopupMenu popup = new PopupMenu(v.getContext(), v);
        popup.getMenuInflater().inflate(R.menu.custom_menu, popup.getMenu());
        popup.setOnMenuItemClickListener(this);
        popup.show();
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        if (listener != null) {
            CustomObject object = objects.get(getAdapterPosition());
            listener.onCustomerMenuAction(object, item);
        }
        return false;
    }
}

public CustomerAdapter(List<CustomObject> objects, OnItemSelectedListener listener, boolean withContextMenu) {
    this.listener = listener;
    this.objects = objects;
    this.withContextMenu = withContextMenu;
}

public interface OnItemSelectedListener {

    void onSelected(CustomObject object);

    void onMenuAction(CustomObject object, MenuItem item);
}

@Override
public CustomerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.snippet_custom_object_line, parent, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(CustomAdapter.ViewHolder holder, int position) {
    CustomObject object = objects.get(position);
    holder.name.setText(object.getName());
    holder.value.setText(object.getValue());
}

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

Tam özet burada https://gist.github.com/brettwold/45039b7f02ce752ae0d32522a8e2ad9c


0

OnCreateContextMenuListener'ı bağlandığında ViewHolder'a iletebilirsiniz. Bu dinleyici, her veri öğesi için özel menü oluşturabilir. ViewHolder'ınıza setOnCreateContextMenuListener ekleyin ve bağlama sırasında çağırın.

     public static class ItemViewHolder extends RecyclerView.ViewHolder
     {


        public ItemViewHolder(View itemView) {
            super(itemView);


        }
        void setOnCreateContextMenuListener(View.OnCreateContextMenuListener listener) {
            itemView.setOnCreateContextMenuListener(listener);
        }

}

Adaptörde:

      @Override
     public void onBindViewHolder(ItemViewHolder viewHolder,
                    int position) {
         final MyObject myObject = mData.get(position);
         viewHolder.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){

                    @Override
                    public void onCreateContextMenu(ContextMenu menu,
                            View v, ContextMenuInfo menuInfo) {
                        switch (myObject.getMenuVariant() {
                            case MNU_VARIANT_1:
                                menu.add(Menu.NONE, CTX_MNU_1, 
                                        Menu.NONE,R.string.ctx_menu_item_1);    
                                menu.add(Menu.NONE, CTX_MNU_2,Menu.NONE, R.string.ctx_menu_item_2); 
                            break;
                            case MNU_VARIANT_2:
                                menu.add(Menu.NONE, CTX_MNU_3,Menu.NONE, R.string.ctx_menu_item_3); 
                            break;
                            default:
                                menu.add(Menu.NONE, CTX_MNU_4, 
                                        Menu.NONE, R.string.ctx_menu_item_4);   

                        }
                    }

                });
     }

0

Benim durumumda, onContextItemSelected()yöntemde parçamdaki verileri kullanmak zorunda kaldım . Ortaya çıkardığım çözüm, parçanın bir örneğini bağdaştırıcıma geçirmek ve görüntüleme öğesini görüntü tutucuya kaydetmekti:

@Override
public void onBindViewHolder(final MyListAdapter.ViewHolder viewHolder, int position) {
    final Object rowObject = myListItems.get(position);

    // Do your data binding here

    viewHolder.itemView.setTag(position);
    fragment.registerForContextMenu(viewHolder.itemView);
}

Ardından onCreateContextMenu()dizini yerel bir değişkene kaydedebilirsiniz:

selectedViewIndex = (int)v.getTag();

ve geri getir onContextItemSelected()


0

Normal bağdaştırıcılarla bu sorunla ilk karşılaştığımda, kendi özel View alt sınıfımı oluşturdum ve ihtiyacım olan şeyleri içinde depoladım. Bu çözümü gerçekten beğenmedim ve insanların önerdiği harika fikirlere çok zaman harcadım ve onlardan daha çok hoşlanmadığıma karar verdim. Bu yüzden her şeyi bir araya getirdim, bir süre etrafta salladım ve sevdiğim yeni bir şeyle çıktım.

Birkaç yardımcı sınıfla başlıyoruz. ContextMenuHandler, bağlam menüsünü işleyecek her nesne için bir arayüzdür. Pratikte, bu bir ViewHolder alt sınıfı olacak, ancak teoride herhangi bir şey olabilir

/**
 * Interface for objects that wish to create and handle selections from a context
 * menu associated with a view
 */
public interface ContextMenuHandler extends View.OnCreateContextMenuListener {

  boolean onContextItemSelected(MenuItem item);
}

Sırada, bir RecyclerView'in hemen alt öğesi olarak kullanılacak olan herhangi bir View tarafından uygulanması gereken bir Arayüz var.

public interface ViewWithContextMenu {
  public void setContextMenuHandler(FragmentWithContextMenu fragment, ContextMenuHandler handler);

  public ContextMenuHandler getContextMenuHandler();
}

Daha sonra, bir RecylcerView alt öğesi olarak bir bağlam menüsü oluşturacak herhangi bir görünüm, ViewWIthContextMenu uygulamalıdır. Benim durumumda, yalnızca bir LinearLayout alt sınıfına ihtiyacım vardı.

public class LinearLayoutWithContextMenu extends LinearLayout implements ViewWithContextMenu {

  public LinearLayoutWithContextMenu(Context context) {
    super(context);
   }

  public LinearLayoutWithContextMenu(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  private ContextMenuHandler handler;

  @Override
  public void setContextMenuHandler(FragmentWithContextMenu fragment, ContextMenuHandler handler) {
    this.handler = handler;
    setOnCreateContextMenuListener(fragment);
  }

  @Override
  public ContextMenuHandler getContextMenuHandler() {
    return handler;
  }
}

Ve son olarak, bağlam menüsü çağrılarını durdurmak ve bunları uygun işleyiciye yönlendirmek için güçlendirilmiş bir Fragment sınıfına ihtiyacımız var.

public class FragmentWithContextMenu extends Fragment {

  ContextMenuHandler handler = null;

  @Override
  public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, view, menuInfo);
    handler = null;
    if (view instanceof ViewWithContextMenu) {
      handler = ((ViewWithContextMenu)view).getContextMenuHandler();
      if (handler != null) handler.onCreateContextMenu(menu, view, menuInfo);
    }
  }

  @Override
  public boolean onContextItemSelected(MenuItem item) {
    if (handler != null) {
      if (handler.onContextItemSelected(item)) return true;
    }
    return super.onContextItemSelected(item);
  }
}

Tüm bunlar yerine getirildiğinde, son uygulama oldukça basittir. Ana parça FragmentWithContextMenu alt sınıfına sahip olmalıdır. Ana RecylerWindow'u normal olarak kurar ve kendisini Adapter alt sınıfına aktarır. Adaptör alt sınıfı şuna benzer:

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

  private final FragmentWithContextMenu fragment;

  Adapter(FragmentWithContextMenu fragment) {
    this.fragment = fragment;
  }

  @Override
  public Adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context)
        .inflate(R.layout.child_view, parent, false);
    return new ViewHolder(view);
  }

  @Override
  public void onBindViewHolder(final Adapter.ViewHolder holder, int position) {
    // Logic needed to bind holder to specific position
    // ......
  }

  @Override
  public int getItemCount() {
    // Logic to return current item count
    // ....
  }

  public class ViewHolder extends RecyclerView.ViewHolder implements ContextMenuHandler {

    ViewHolder(View view) {
      super(view);
      ((ViewWithContextMenu)view).setContextMenuHandler(fragment, this);

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

          // Do stuff to handle simple clicks on child views
          // .......
        }
      });
    }

   @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {

      // Logic to set up context menu goes here
      // .... 
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {

      // Logic to handle context menu item selections goes here
      // ....

      return true;
    }
  }
}

Bu onunla ilgili. Her şey çalışıyor gibi görünüyor. Tüm fayda sınıflarını ayrı bir bağlam menüsü paketine koydu, böylece sınıflarla eşleşen sınıfların adlarını verebilirdim, alt sınıflandırma var, ancak daha kafa karıştırıcı olacağını düşündüm.


-1

Tamam, @ Flexo'nun cevabına göre, mPosition'u sıraya koyacağım ...

protected class ExampleViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {

    int mPosition;

    public KWViewHolder(View itemView) {
        super(itemView);
        itemView.setOnCreateContextMenuListener(this);
    }

    public void setPosition(int position) {
        mPosition = position;
    }

    @Override
    public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
        contextMenu.setHeaderTitle(R.string.menu_title_context);
        contextMenu.add(0, R.id.menu_delete, mPosition, R.string.delete);
    }
}

ardından onContextItemSelected I kullanım

item.getOrder() 

Ve hepsi iyi çalışıyor dizinin konumunu kolayca alıyorum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.