2015-04-06 14 views
12

Mam przycisk przepełnienia wewnątrz CardView w Recyclerview. Za każdym razem, gdy klikam przycisk, wyświetlam menu kontekstowe, ale także RecyclerView przewija w dół o jedną pozycję. Czy ktoś może mi pomóc powstrzymać to niechciane przewijanie?PopupMenu kliknięcie powoduje, że RecyclerView przewija

Zasadniczo próbuję replikować takie samo zachowanie przycisku przepełnienia, jak w Playstore.

Układ:

<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: Masz problem .Przy wyświetla menu podręczne, to ślizga listę w dół, aby wyświetlić całą listę rozwijaną. Jak dostosować wyskakujące okienko do wyświetlenia w górę/w dół w zależności od dostępnego miejsca?

Odpowiedz

23

Próbowano za pomocą android.widget.PopupMenu zamiast android.support.v7.widget.PopupMenu i Voila, to działa. Czyli jest to błąd w bibliotece Support. Czy świetni programiści tutaj potwierdzają to samo?

+0

To samo dla mnie, używając android.widget.PopupMenu działa do tej pory. – Chris

9

Możesz mieć swoje AnchorView zastąpić requestRectangleOnScreen() i zwrócić false. Zapobiegnie to przewijaniu dowolnego rodzica ScrollView.

Więc w twoim przypadku, imgBtnOverflow byłoby zwyczaj ImageButton, tak:

/** 
* 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; 
    } 
} 

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

Problem został złożony przeciwko PopupMenu tutaj Obsługa: https://code.google.com/p/android/issues/detail?id=135439

0

requestRectangleOnScreen nie działa dla mnie, w moim przypadku, requestRectangleOnScreen nie wywołano, gdy pojawi się popupMenu. moje rozwiązanie jest przesłonięcie requestChildRectangleOnScreen, i reture false, działa dobrze.

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

Mam ten sam problem, i używam w ten sposób:

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 użytkownika layoutmanager zarządzać układ, więc myślę, że zmiana layoutmanger behaver jest rozwiązaniem gracz.

Powiązane problemy