2017-05-21 5 views
0

Ich arbeite an einer Android App. Ich habe ein Problem mit dem Öffnen eines Popup-Menüs, wenn ich in der Recycler-Ansicht auf ein Element klicke.Recycler Ansicht in Android nicht klicken

Show.java (die Aktivität, die die Recycler-Ansicht enthält). mRecycler ist das Objekt, das dem RecyclerView zugeordnet ist.

mRecycler.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), mRecycler, new RecyclerViewClickListener() { 
     @Override 
     public void onClick(View view, final int position) { 
      PopupMenu menu = new PopupMenu(Show.this,mRecycler); 
      MenuItem itemView = (MenuItem) findViewById(R.id.three); 
      if(method.equals("Completed")) 
       itemView.setTitle("Mark as imcomplete"); 
      menu.getMenuInflater().inflate(R.menu.menu_popup,menu.getMenu()); 

      menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){ 
       public boolean onMenuItemClick(MenuItem item){ 
        int id=item.getItemId(); 
        switch (id){ 
         case R.id.one: 
          Intent intent = new Intent(Show.this,Add.class); 
          intent.putExtra("Task",tasks.get(position)); 
          startActivity(intent); 
          finish(); 
          startActivity(getIntent()); 
          break; 
         case R.id.two: 
          deleteRecord(position); 
          break; 
         case R.id.three: 
          toggleComplete(position); 
        } 
        return true; 
       } 
      }); 

     } 

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

-Code-Snippet für xml von RecyclerView

<android.support.v7.widget.RecyclerView 
     android:id="@+id/recycler" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentStart="true" 
     android:scrollbars="vertical" 
     android:clickable="true" 
     android:contextClickable="true" 
     android:longClickable="true" /> 

RecyclerViewClickListener.java

public interface RecyclerViewClickListener { 
    void onClick(View view,int position); 
    void onLongClick(View view,int position); 
} 

RecyclerTouchListener.java - Klasse, die die OnItemTouchListener implementiert

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener{ 
    private GestureDetector gestureDetector; 
    private RecyclerViewClickListener clickListener; 

    public RecyclerTouchListener (Context context,final RecyclerView recyclerView, 
            final RecyclerViewClickListener clickListener){ 
     this.clickListener = clickListener; 
     gestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){ 
      @Override 
      public boolean onSingleTapUp(MotionEvent e){ 
       return true; 
      } 

      @Override 
      public void onLongPress(MotionEvent e){ 
       View child = recyclerView.findChildViewUnder(e.getX(),e.getY()); 
       if (child != null && clickListener!=null) 
        clickListener.onLongClick(child,recyclerView.getChildAdapterPosition(child)); 
      } 

     }); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e){ 
     View child = rv.findChildViewUnder(e.getX(),e.getY()); 
     if (child !=null && clickListener !=null && gestureDetector.onTouchEvent(e)) 
      clickListener.onClick(child,rv.getChildAdapterPosition(child)); 
     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView rv,MotionEvent e){} 

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntecept){} 
} 

Noth Das passiert, wenn ich auf einen Gegenstand im RecyclerView klicke. Das Android-System erkennt nicht einmal, dass es angeklickt wurde. Bitte überprüfen Sie, was das Problem mit meinem Code ist.

Antwort

1

bitte Sie daher auf diese Weise

public class Show extends AppCompactActivity implements PopupMenu.OnMenuItemClickListener 

hoffentlich

mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), mRecyclerView, new ClickListener() { 
      @Override 
      public void onClick(View view, int position) { 
       menuCardIndex = position; 
       PopupMenu popupMenu = new PopupMenu(Show.this, view); 
       popupMenu.setOnMenuItemClickListener(Show.this); 
       popupMenu.inflate(R.menu.menu_popup); 
       popupMenu.show(); 
      } 

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

@Override 
public boolean onMenuItemClick(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.one: 
      Your_First_Operation; 
      return true; 
     case R.id.two: 
      Your_Second_Operation; 
      return true 
     case R.id.three: 
      Your_Third_Operation; 
      return true 
    } 
    return false; 
} 

schließlich setzen diese eine Ihrer Tätigkeit versuchen, können Sie Ihre Klick Zuhörer hören. Wenn es richtig funktioniert, können Sie Ihre Logik einstellen.

0

Wenn Ihr RecyclerView Artikel „klickbare“ Kinder in ihrer XML-Datei hat, versuchen Sie die Eigenschaft zu deklarieren:

android:clickable="false" 

Lassen Sie die klickbaren wahr nur auf dem Vater Ihr Listenelement.

Wenn dies nicht der Fall ist oder Sie unbedingt anklickbare Elemente in Ihrem Listenelement benötigen, gibt es eine andere Lösung.


Wenn Sie einen RecyclerView verwenden, sollten Sie einen RecyclerView Adapter irgendwo in Ihrem Code implementiert haben.

Im OnBindViewHolder Methode, versuchen Sie den folgenden Code ein:

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

    //YOUR CODE ... 

    holder.itemView.setOnTouchListener(yourOnTouchListener); 

    //MORE CODE ... 
} 

Dies wird die OnTouchListener auf die einzige ItemView im Moment gesetzt die Liste erzeugt wird.

Ich hoffe meine Antwort ist hilfreich und verständlich genug.

Verwandte Themen