所以我有一個ViewPager
,ViewPager
包含兩個選項卡,每個選項卡包含RecyclerView
,卡可以添加和刪除從每個RecyclerView
。每個RecyclerView
包含在Fragment
之內。每個RecyclerView
使用ItemTouchHelper
來管理onSwiped()
事件。在RecyclerView
內卡有幾種行爲:ViewPager從兒童片段偷水平觸摸事件
- 向右滑動打開該卡
- 向左滑動編輯刪除存儲卡
- 卡上按住,然後上下拖動向上或向下再 - 卡片的位置。
我的問題是,ViewPager
被截取每個RecyclerView
的onSwiped()
方法,但是,垂直觸摸事件仍能正常各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;
}
}
好吧,我用你的代碼替換了'ViewPager',但它仍然不起作用。如果在屏幕邊緣附近開始滑動,則滑動即可更改標籤,但「RecyclerView」中的卡仍不會移動。任何其他想法? @CommonsWare – wdavies973
@ wdavies973:你在'if()'測試中發現了什麼,我有'v instanceof RecyclerView'? – CommonsWare
好吧,目前它只是一樣的('v instanceof RecyclerView'),但我不認爲'canScroll()'在接收'onSwiped()'的'RecylerViews'上有所不同,你有什麼建議嗎?我可以檢查查看ID,但我不確定。 – wdavies973