2017-03-18 51 views
2

所以我有一個ViewPagerViewPager包含兩個選項卡,每個選項卡包含RecyclerView,卡可以添加和刪除從每個RecyclerView。每個RecyclerView包含在Fragment之內。每個RecyclerView使用ItemTouchHelper來管理onSwiped()事件。在RecyclerView內卡有幾種行爲:ViewPager從兒童片段偷水平觸摸事件

  • 向右滑動打開該卡
  • 向左滑動編輯刪除存儲卡
  • 卡上按住,然後上下拖動向上或向下再 - 卡片的位置。

我的問題是,ViewPager被截取每個RecyclerViewonSwiped()方法,但是,垂直觸摸事件仍能正常各RecyclerView收到。顯然,這可以歸結爲觸碰衝突問題。 ViewPager需要水平觸摸事件來更改制表符,並且RecyclerView需要水平觸摸事件來刷卡。但是,ViewPager正在竊取所有觸摸事件。我禁止在ViewPager上進行水平滑動(用戶可以通過點擊選項卡指示器來更改選項卡的唯一方法),但RecyclerView仍然不會收到任何水平觸摸事件。

這裏的ViewPager有殘疾的描繪:

public class NoSwipePager extends ViewPager { 

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

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    return false; 
} 
} 

這裏有一個片段類:

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.pit_tab, container, false); 
    container.getParent().requestDisallowInterceptTouchEvent(true); 
    RecyclerView rv = (RecyclerView) view.findViewById(R.id.movie_recycler_view); 

    return view; 
} 

這裏是管理RecyclerView類:

public EditManager(RecyclerView rv, Context act, EditListener listener, ArrayList<Element> elements, boolean editing, boolean pit) { 
    //rv = (RecyclerView) act.findViewById(R.id.movie_recycler_view); 
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(act); 
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    rv.setLayoutManager(linearLayoutManager); 
    ((SimpleItemAnimator) rv.getItemAnimator()).setSupportsChangeAnimations(false); 

    if(elements != null) elementsAdapter = new ElementsAdapter(listener, act, new LinkedList<>(elements), editing); 
    else elementsAdapter = new ElementsAdapter(listener, act, null, editing); 
    rv.setAdapter(elementsAdapter); 

    ItemTouchHelper.Callback callback = new ElementTouchHelper(elementsAdapter); 
    ItemTouchHelper helper = new ItemTouchHelper(callback); 
    helper.attachToRecyclerView(rv); 
} 

最後,這裏的應該被調用的方法,但不是:

@Override 
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) { 
    if(direction == ItemTouchHelper.RIGHT) { 
     mElementsAdapter.postEdit(mElementsAdapter.getElement(viewHolder.getAdapterPosition())); 
     return; 
    } 
} 

回答

0

嘗試更換您的NoSwipePager這個:

public class NoSwipePager extends ViewPager { 
    public NoSwipePager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    @Override 
    protected boolean canScroll(View v, boolean checkV, int dx, int x, 
           int y) { 
    if (v instanceof RecyclerView) { 
     return(true); 
    } 

    return(super.canScroll(v, checkV, dx, x, y)); 
    } 
} 

我已經成功地使用這種方法的ViewPager在頁面的地圖(代SurfaceViewRecyclerView)。我的猜測是,您需要用更復雜的東西(並定製到您的應用)替換v instanceof RecyclerView測試。但我認爲canScroll()比攔截onInterceptTouchEvent()更可能給你想要的東西。

+0

好吧,我用你的代碼替換了'ViewPager',但它仍然不起作用。如果在屏幕邊緣附近開始滑動,則滑動即可更改標籤,但「RecyclerView」中的卡仍不會移動。任何其他想法? @CommonsWare – wdavies973

+0

@ wdavies973:你在'if()'測試中發現了什麼,我有'v instanceof RecyclerView'? – CommonsWare

+0

好吧,目前它只是一樣的('v instanceof RecyclerView'),但我不認爲'canScroll()'在接收'onSwiped()'的'RecylerViews'上有所不同,你有什麼建議嗎?我可以檢查查看ID,但我不確定。 – wdavies973