2015-04-06 5 views
12

Ich habe einen Überlaufknopf innerhalb einer CardView in Recyclerview. Immer wenn ich auf die Schaltfläche klicke, blicke ich ein Popup-Menü auf, aber auch RecyclerView scrollt einen Punkt nach unten. Kann mir bitte jemand helfen, dieses unerwünschte Scrollen zu stoppen?PopupMenu Klick verursacht RecyclerView zum Scrollen

Im Grunde versuche ich, das gleiche Überlauf-Button-Verhalten wie in Playstore zu replizieren.

Layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_margin="5dp"> 

<android.support.v7.widget.CardView 
    android:id="@+id/cv_tracks" 
    android:layout_width="match_parent" 
    android:layout_height="65dp" 
    > 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="60dp"> 

     <ImageView 
      android:id="@+id/ivTracks" 
      android:layout_width="60dp" 
      android:layout_height="60dp" 
      android:background="@drawable/unknown" 
      /> 
     <Button 
      android:id="@+id/imgbtn_overflow" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@android:color/transparent" 
      android:drawableTop="@drawable/ic_overflow" 
      android:paddingLeft="25dp" 
      android:paddingRight="20dp" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" /> 
</RelativeLayout> 
</android.support.v7.widget.CardView> 
</RelativeLayout> 

Adapter:

@Override 
public void onBindViewHolder(final TracksViewHolder tracksViewHolder, int i) { 

    tracksViewHolder.imgBtnOverflow.setTag(i); 
    tracksViewHolder.imgBtnOverflow.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //Creating the instance of PopupMenu 
      final int position = (Integer) v.getTag(); 

      PopupMenu popup = new PopupMenu(mContext,tracksViewHolder.imgBtnOverflow); 

      //Inflating the Popup using xml file 
      popup.getMenuInflater() 
        .inflate(R.menu.popup_menu_overflow, popup.getMenu()); 


      //registering popup with OnMenuItemClickListener 
      popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 

       public boolean onMenuItemClick(MenuItem item) { 

       if(mPopUpClick!=null) 
        mPopUpClick.actionOnPopUpItemClick(position,item,songs.get(position)); 
        return true; 
       } 
      }); 

      popup.show(); //showing popup menu 
     } 
    }); 

} 

UPDATE: Haben Sie das Problem .Wenn das Popup-Menü angezeigt wird, wird die Liste nach unten gleitet, um die gesamte Dropdown angezeigt werden soll. Wie wird das Popup so angepasst, dass es je nach verfügbarem Platz angezeigt wird?

Antwort

23

Versucht mit android.widget.PopupMenu anstelle von android.support.v7.widget.PopupMenu und Voila, es funktioniert. Also ist es ein Fehler in der Support-Bibliothek. Können großartige Entwickler das hier bestätigen?

+0

Das gleiche für mich, mit android.widget.PopupMenu funktioniert so weit. – Chris

9

Sie können Ihr AnchorView überschreiben requestRectangleOnScreen() und false zurückgeben. Dies verhindert, dass ein Elternteil ScrollView scrollt.

also in Ihrem Fall würde imgBtnOverflow eine benutzerdefinierte ImageButton, wie so sein:

/** 
* A custom {@link ImageButton} which prevents parent ScrollView scrolling when used as the 
* anchor for a {@link android.support.v7.widget.PopupMenu} 
*/ 
public class NonScrollImageButton extends ImageButton { 

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

    @Override 
    public boolean requestRectangleOnScreen(Rect rectangle, boolean immediate) { 
     return false; 
    } 
} 

Props jankovd (https://gist.github.com/jankovd/19ef35efd1f00e9213fa)

Ein Problem hat sich gegen die Unterstützung PopupMenu hier eingereicht worden: https://code.google.com/p/android/issues/detail?id=135439

0

requestRectangleOnScreen nicht funktionieren für mich, in meinem Fall requestRectangleOnScreen nicht aufgerufen, wenn PopupMenu anzeigen. meine Lösung ist Override requestChildRectangleOnScreen, und reture false, gut funktionieren.

public class PopupAncorRecyclerViewPager extends RecyclerView { 
     @Override 
    public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) { 
     return false; 
    } 
} 
1

Ich habe gleiches Problem, und ich verwende diese Weise:

mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false) { 
      @Override 
      public boolean requestChildRectangleOnScreen(RecyclerView parent, View child, Rect rect, boolean immediate) { 
       return false; 
      } 
     }; 
mRecyclerView.setLayoutManager(mLayoutManager); 

RecyclerView Benutzer Layoutmanager zu Layout zu verwalten, so dass ich denke Änderung layoutmanger behaver ist die bettor Lösung.