我正在使用Jack Wharton的Android DirectionalViewPager(https://github.com/JakeWharton/Android-DirectionalViewPager)来垂直滚动片段。我有两个片段,其中一个有47deg的SwipeListView(https://github.com/47deg/android-swipelistview)。问题是当用户使用SwipeListView在片段上时,他无法滚动列表,因为因为DirectionalViewPager而暂时更改为另一个片段。
问题
¿我可以用不同的方式捕获SwipeListView的滚动事件,以便与DirectionalViewPager的滚动一起工作吗?
¿用一根手指滚动更改列表视图内部并用两根手指在DirectionalViewPager内滚动是可行的吗?如果可能,¿我该怎么做?
¿你有什么其他建议可以解决这个问题吗?
我非常感谢你的帮助。
谢谢
ComprasActivity.java
package com.easyshopping.activities;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import com.directionalviewpager.DirectionalViewPager;
import com.easyshopping.easyshopping.R;
public class ComprasActivity extends FragmentActivity {
// Fragments
public static Fragment[] fragmentos = new Fragment[2];
/**
* The number of pages (wizard steps) to show in this demo.
*/
private static final int NUM_PAGES = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_compras);
// Set up the pager
final DirectionalViewPager pager = (DirectionalViewPager) findViewById(R.id.pager);
pager.setAdapter(new ScreenSlidePagerAdapter(getSupportFragmentManager()));
pager.setOrientation(DirectionalViewPager.VERTICAL);
}
/**
* A simple pager adapter that represents 5 ScreenSlidePageFragment objects,
* in sequence.
*/
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
fragmentos[1] = new ShoppingListFragment();
fragmentos[0] = new CameraTestFragment();
}
@Override
public Fragment getItem(int position) {
return fragmentos[position];
}
@Override
public int getCount() {
return NUM_PAGES;
}
}
}
ShoppingListFragment.java
package com.easyshopping.activities;
import java.util.ArrayList;
import com.easyshopping.easyshopping.R;
import com.fortysevendeg.swipelistview.BaseSwipeListViewListener;
import com.fortysevendeg.swipelistview.SwipeListView;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class ShoppingListFragment extends Fragment {
SwipeListView myListView;
ArrayList<String> myStringArray1;
ShoppingListAdapter adapter;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_shoppinglist, container, false);
myListView = (SwipeListView) rootView.findViewById(R.id.shoppingList);
myStringArray1 = new ArrayList<String>();
myStringArray1.add("something");
myStringArray1.add("something");
myStringArray1.add("something");
myStringArray1.add("something");
myStringArray1.add("something");
myStringArray1.add("something");
myStringArray1.add("something");
myStringArray1.add("something");
myStringArray1.add("something");
myStringArray1.add("something");
myStringArray1.add("something");
myStringArray1.add("something");
myStringArray1.add("something");
adapter = new ShoppingListAdapter(getActivity(), myStringArray1);
myListView.setAdapter(adapter);
myListView.setSwipeListViewListener(new BaseSwipeListViewListener() {
@Override
public void onOpened(int position, boolean toRight) {
}
@Override
public void onClosed(int position, boolean fromRight) {
}
@Override
public void onListChanged() {
}
@Override
public void onMove(int position, float x) {
Log.d("MOVE_LIST", "pos: " + position + "; float: " + x);
}
@Override
public void onStartOpen(int position, int action, boolean right) {
Log.d("swipe", String.format("onStartOpen %d - action %d", position, action));
}
@Override
public void onStartClose(int position, boolean right) {
Log.d("swipe", String.format("onStartClose %d", position));
}
@Override
public void onClickFrontView(int position) {
Log.d("swipe", String.format("onClickFrontView %d", position));
}
@Override
public void onClickBackView(int position) {
Log.d("swipe", String.format("onClickBackView %d", position));
}
@Override
public void onDismiss(int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
myStringArray1.remove(position);
}
adapter.notifyDataSetChanged();
}
});
return rootView;
}
}
答案 0 :(得分:0)
在我对您的问题发表评论之后,我调查了我链接到的一个库。事实证明this one *支持垂直ViewPager中的垂直滚动内容。对于你的问题:
我可以用不同的方式捕获SwipeListView的滚动事件 如何与DirectionalViewPager的滚动一起工作?
您可以继承ViewPager并覆盖onInterceptTouchEvent()
,阻止ViewPager移动到下一页,直到ListView到达其最后一个子项。
用一根手指滚动以更改列表视图内部是可行的 并用两根手指在DirectionalViewPager内滚动?如果 那是可能的,¿我怎么能这样做?
有可能,但我强烈建议你不要这样做。考虑一下您的用户和可用性。同样,关键是使用onInterceptTouchEvent()
。
您还有其他建议可以解决这个问题吗?
是。使用不同的库,就像我之前建议的那样。 This VerticalViewPager已经为您处理了。请参阅源代码的this line以了解其工作原理。您正在使用的DirectionalViewPager已弃用。
* 这并不意味着其他库也不支持垂直滚动,这意味着我只检查了其中一个。