ListView 和 ViewPager 中的 SwipeDismissListViewTouchListener
SwipeDismissListViewTouchListener in ListView and ViewPager
我有一个包含 ListFragment
和 TouchListener
(SwipeDismissListViewTouchListener) 的 ViewPager。我这样修改了 ViewPager
:
public class CustomViewPager extends ViewPager {
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
private boolean pagingEnabled = true;
public void setPagingEnabled(boolean enabled) {
pagingEnabled = enabled;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (!pagingEnabled) {
return false; // do not intercept
}
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!pagingEnabled) {
return false; // do not consume
}
return super.onTouchEvent(event);
}
}
并且我在 ListFragment
方法中禁用了从 onOptionsItemSelected
滑动 ViewPager
。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_edit) {
CustomViewPager vp = (CustomViewPager) getActivity().findViewById(R.id.pager);
vp.setPagingEnabled(false);
getListView().requestDisallowInterceptTouchEvent(true);
}
return super.onOptionsItemSelected(item);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SwipeDismissListViewTouchListener touchListener =
new SwipeDismissListViewTouchListener(
getListView(),
new SwipeDismissListViewTouchListener.DismissCallbacks() {
@Override
public boolean canDismiss(int position) {
return true;
}
@Override
public void onDismiss(ListView listView, int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
removeItem(position);
}
}
}
);
getListView().setOnTouchListener(touchListener);
// Setting this scroll listener is required to ensure that during ListView scrolling,
// we don't look for swipes.
getListView().setOnScrollListener(touchListener.makeScrollListener());
}
ViewPager
的滑动被禁用了,但是我不能运行SwipeDismissListViewTouchListener
的问题。
我已经测试了这些答案,但对我不起作用
Nesting Android ViewPager, Swiping ListItems inside a ListView horizontally
ViewPager intercepts all x-axis onTouch events. How to disable?
Capture swipe to dismiss listview gestures in ViewPager
有什么解决办法吗?谢谢
只需几个简单的操作即可解决您的问题。
- 移除 ViewPager 的 onInterceptTouch() 和 onTouch(),它的
不需要。
- 如果我没记错的话你错过了对 notifyDatasetChange() 的调用
在 onDismiss().
中的 for 循环之后
- 进入 SwipeTouchListener 代码并为方向创建一个子句
所以它将启用某个方向(现在想想 Google
仅在一个方向上启用滑动)。我猜你
仅对第一页和最后一页启用滑动,如果没有则
考虑一下,因为为中间页面启用 swipe2dismiss 是一个
糟糕的用户体验描述。
我找到了错误的解决方案。
在这个问题中,我回答了如何在 Fabric 库中禁用 onClick 方法。
项目相同项目相同,此相关错误。
在此方法中禁用视图、可点击和可长时间点击:
//helper method to disable subviews
private void disableViewAndSubViews(ViewGroup layout) {
layout.setEnabled(false);
for (int i = 0; i < layout.getChildCount(); i++) {
View child = layout.getChildAt(i);
if (child instanceof ViewGroup) {
disableViewAndSubViews((ViewGroup) child);
} else {
child.setEnabled(false);
child.setClickable(false);
child.setLongClickable(false);
}
}
}
并禁用 swipe2dismiss 方法
解决方案是在列表适配器上添加以下行:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
//disable subviews to avoid links are clickable
ViewTweetUtils.disableViewAndSubViews((ViewGroup) view);
//enable root view and attach custom listener
view.setEnabled(true);
view.setClickable(false);
return view;
}
view.setEnabled 只是行不通。您必须添加 view.setClickable(false)。为什么?我不知道,但它有效。
感谢您的帮助
我有一个包含 ListFragment
和 TouchListener
(SwipeDismissListViewTouchListener) 的 ViewPager。我这样修改了 ViewPager
:
public class CustomViewPager extends ViewPager {
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
private boolean pagingEnabled = true;
public void setPagingEnabled(boolean enabled) {
pagingEnabled = enabled;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (!pagingEnabled) {
return false; // do not intercept
}
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!pagingEnabled) {
return false; // do not consume
}
return super.onTouchEvent(event);
}
}
并且我在 ListFragment
方法中禁用了从 onOptionsItemSelected
滑动 ViewPager
。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_edit) {
CustomViewPager vp = (CustomViewPager) getActivity().findViewById(R.id.pager);
vp.setPagingEnabled(false);
getListView().requestDisallowInterceptTouchEvent(true);
}
return super.onOptionsItemSelected(item);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SwipeDismissListViewTouchListener touchListener =
new SwipeDismissListViewTouchListener(
getListView(),
new SwipeDismissListViewTouchListener.DismissCallbacks() {
@Override
public boolean canDismiss(int position) {
return true;
}
@Override
public void onDismiss(ListView listView, int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
removeItem(position);
}
}
}
);
getListView().setOnTouchListener(touchListener);
// Setting this scroll listener is required to ensure that during ListView scrolling,
// we don't look for swipes.
getListView().setOnScrollListener(touchListener.makeScrollListener());
}
ViewPager
的滑动被禁用了,但是我不能运行SwipeDismissListViewTouchListener
的问题。
我已经测试了这些答案,但对我不起作用
Nesting Android ViewPager, Swiping ListItems inside a ListView horizontally
ViewPager intercepts all x-axis onTouch events. How to disable?
Capture swipe to dismiss listview gestures in ViewPager
有什么解决办法吗?谢谢
只需几个简单的操作即可解决您的问题。
- 移除 ViewPager 的 onInterceptTouch() 和 onTouch(),它的 不需要。
- 如果我没记错的话你错过了对 notifyDatasetChange() 的调用 在 onDismiss(). 中的 for 循环之后
- 进入 SwipeTouchListener 代码并为方向创建一个子句 所以它将启用某个方向(现在想想 Google 仅在一个方向上启用滑动)。我猜你 仅对第一页和最后一页启用滑动,如果没有则 考虑一下,因为为中间页面启用 swipe2dismiss 是一个 糟糕的用户体验描述。
我找到了错误的解决方案。
在这个问题中,我回答了如何在 Fabric 库中禁用 onClick 方法。
项目相同项目相同,此相关错误。 在此方法中禁用视图、可点击和可长时间点击:
//helper method to disable subviews
private void disableViewAndSubViews(ViewGroup layout) {
layout.setEnabled(false);
for (int i = 0; i < layout.getChildCount(); i++) {
View child = layout.getChildAt(i);
if (child instanceof ViewGroup) {
disableViewAndSubViews((ViewGroup) child);
} else {
child.setEnabled(false);
child.setClickable(false);
child.setLongClickable(false);
}
}
}
并禁用 swipe2dismiss 方法
解决方案是在列表适配器上添加以下行:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
//disable subviews to avoid links are clickable
ViewTweetUtils.disableViewAndSubViews((ViewGroup) view);
//enable root view and attach custom listener
view.setEnabled(true);
view.setClickable(false);
return view;
}
view.setEnabled 只是行不通。您必须添加 view.setClickable(false)。为什么?我不知道,但它有效。
感谢您的帮助