2017-08-27 18 views
0

私はrecyclerviewのリスト項目の画像ビューをクリックしようとしています。私はtoastメソッドにview.getContext()を渡してToastメッセージを呼び出すことができました。しかし何らかの理由で私はそれをすることができません。それは、setOnMenuItemClickListenerをPopupMenuに適用できないことを伝えます。私は間違って何をしていますか?ViewHolderオブジェクト内からポップアップメニューを呼び出そうとしています

public static class ViewHolder extends RecyclerView.ViewHolder{ 

     public TextView tvName; 
     public TextView tvDate; 
     public ImageView imageView; 

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

      tvName = (TextView)itemView.findViewById(R.id.match_name); 
      tvDate = (TextView)itemView.findViewById(R.id.match_date); 
      imageView = (ImageView)itemView.findViewById(R.id.imageView); 

      imageView.setOnClickListener(new View.OnClickListener(){ 

       @Override 
       public void onClick(View view) { 

        PopupMenu popupMenu = new PopupMenu(view.getContext(), view); 
        popupMenu.setOnMenuItemClickListener(view.getContext()); 
        popupMenu.inflate(R.menu.popup_menu); 
        popupMenu.show(); 


        Toast.makeText(view.getContext(), "onClick working", Toast.LENGTH_LONG).show(); 
       } 
      }); 
     } 
+0

はあなた 'OnMenuItemClickListener'は何をすべきかをしたいですか? –

+0

私は、2つのオプション(編集、削除)を持つポップアップメニューを作成したいと思っています –

+0

と 'あなたは何をあなたにしたいですか? –

答えて

0

次のような匿名のPopupMenu.OnMenuItemClickListenerを使用することができます。私はそれはあなたを助けるかもしれないPopMenu

imageView.setOnClickListener(new View.OnClickListener(){ 

      @Override 
      public void onClick(View view) { 

       final PopupMenu popup = new PopupMenu(view.getContext(), imageView); 
            popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu()); 
            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
             @Override 
             public boolean onMenuItemClick(MenuItem item) { 
              switch (item.getItemId()) { 
               case R.id.item_edit: 
                // to edit 

                break; 
               case R.id.item_delete: 
                // to delete 

                break; 
              } 
              return false; 
             } 
            }); 
            //displaying the popup 
            popup.show(); 

       Toast.makeText(view.getContext(), "onClick working", Toast.LENGTH_LONG).show(); 
      } 
     }); 

RecycleViewで表示するには、このようないくつかのコードを使用しています

popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){ 
    public boolean onMenuItemClick(MenuItem item){ 
     // your stuff here (one frequently uses a switch-case, 
     // the cases depending on item.getId()) 
    } 
}); 
+0

私はこれをしようとしていますが、インテントを使ってポップアップメニューから別のアクティビティにユーザーを送りたい場合は、匿名クラスから呼び出すときにインテントの最初のパラメータのコンテキストを取得するにはどうすればいいですか? ViewHolder - > ImageView(クリックリスナー) - > PopupMenu(onMenuItemClick) - > Intent? –

+0

ViewHolderには、viewであるitemViewというパブリックフィールドがありますので、Context – 0X0nosugar

+0

@ HelpMeI'mStupidがあります。または、あなたのケースでは、コンストラクタパラメータをfinalにして、そのコンテキストを使用してください。 – 0X0nosugar

0

。 :)

+0

これはうまくいっていますが、実装の問題がもう1つあります。私は "item_delete"をクリックし、私を別のアクティビティに送るインテントを作成したいと思います。しかし、どのようなコンテキストをインテントの意味に渡すことができますか?私はそれをアクティビティクラスから呼び出さないのですか?新しいインテント(=、EditMatchActivity.class) –

+0

インテントインテント=新しいインテント(MainAcivity.this、EditActivity.class); 'この行を使用して別のアクティビティを開きます。 –

+0

MainActivity.thisをコンテキストとして渡すことはできません。 。私はこれをViewHolderの中からアクティビティではなくアダプタクラスの内部から作成します –

0

Android Recyclerview onItemClickListenerを使用すると、これを試すことができない理由はListViewのように機能します。

出典:http://sapandiwakar.in/recycler-view-item-click-handler/

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.View; 

public class RecyclerItemClickListener implements 
     RecyclerView.OnItemTouchListener { 

    private OnItemClickListener mListener; 
    public interface OnItemClickListener { 
     public void onItemClick(View view, int position); 
    } 
    GestureDetector mGestureDetector; 
    public RecyclerItemClickListener(Context context, OnItemClickListener listener) { 
     mListener = listener; 
     mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onSingleTapUp(MotionEvent e) { 
       return true; 
      } 
     }); 
    } 
    @Override 
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { 
     View childView = view.findChildViewUnder(e.getX(), e.getY()); 
     if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { 
      mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); 
     } 
     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { 
    } 

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

    } 
} 
関連する問題