2017-08-03 95 views
0

我正在創建老虎機應用程序,爲此我使用RecycleView作爲導軌。因此,對於RecyclerView,所有touch \ click \ scroll事件都被禁用。RecyclerView - 觸摸後禁用甩尾止損

爲了使「旋轉」我用RecyclerView.fling(...)方法,因爲它有更好的動畫。

但是當我觸摸回收站視圖時,突然停止扔掉。 爲什麼?我該如何禁用它?

XML:

<android.support.v7.widget.RecyclerView 
     android:id="@+id/rv_rail" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginLeft="@dimen/margin_4" 
     android:layout_marginStart="@dimen/margin_4" 
     android:layout_weight="1" 
     android:padding="@dimen/dp_16"/> 

RecyclerView的初始化:

LinearLayoutManager mRailLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);  
mRailsBinding.rvRail.setHasFixedSize(true); 
new LinearSnapHelper().attachToRecyclerView(mRailsBinding.rvRail); 
mRailsBinding.rvRail.setLayoutManager(mRailLayoutManager); 
mRailsBinding.rvRail.addOnItemTouchListener(new RecyclerViewDisabler()); 
mRailsBinding.rvRail.addOnScrollListener(railScrollListener); //checking here for time when scroll ended 
mRailsBinding.rvRail.setAdapter(mRailAdapter); 

適配器沒有什麼特別之處。它只是在視圖中,並沒有點擊\ touch evenets。

RecyclerViewDisabler:

public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener { 
    @Override 
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 
     return true; 
    } 

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

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

回答

0

只要閱讀文檔小心,發現解決方案。我需要手動使用dispatchTouchEvenet。見代碼:

public class UntouchableRecyclerView extends RecyclerView { 
    public UntouchableRecyclerView(Context context) { 
     super(context); 
    } 

    public UntouchableRecyclerView(Context context, @Nullable AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public UntouchableRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     return true; //consume 
    } 
}