Android中VerticalViewPager中片段内的ListView(ListView inside a Fragment in a VerticalViewPager in Android)

编程入门 行业动态 更新时间:2024-10-28 14:31:06
Android中VerticalViewPager中片段内的ListView(ListView inside a Fragment in a VerticalViewPager in Android)

我正在使用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; } }

I'm using Jack Wharton's Android DirectionalViewPager (https://github.com/JakeWharton/Android-DirectionalViewPager) to scroll fragments vertically. I have two fragments, one of these have a 47deg's SwipeListView (https://github.com/47deg/android-swipelistview). The problem is that when user is on the fragment with the SwipeListView he can't scroll the list because inmediately change to the other fragment because the DirectionalViewPager.

Questions

¿Can I capture the scroll events of the SwipeListView in a different way to work together with the scroll of the DirectionalViewPager?

¿It's posible to scroll with one finger to change inside the listview and with two fingers to scroll inside the DirectionalViewPager? If that's possible, ¿How can I do that?

¿Do you have any other suggestion to solve this problem?

I'd really appreciate your help.

Thank you

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; } }

最满意答案

在我对您的问题发表评论之后,我调查了我链接到的一个库。 事实证明, 这一个 *支持垂直ViewPager内的垂直滚动内容。 对于你的问题:

我可以以不同的方式捕获SwipeListView的滚动事件,以与DirectionalViewPager的滚动一起使用吗?

您可以继承ViewPager并覆盖onInterceptTouchEvent() ,停止ViewPager移动到下一页,直到ListView到达其最后一个子项。

用一根手指滚动更改列表视图内部并用两根手指在DirectionalViewPager内滚动是可行的吗? 如果可能的话,¿我该怎么做?

这是有可能的,但我强烈建议你不要这样做。 考虑一下您的用户和可用性。 同样,关键是使用onInterceptTouchEvent() 。

你有什么其他建议可以解决这个问题吗?

是。 使用不同的库,就像我之前建议的那样。 这个VerticalViewPager已经为你处理了它。 请参阅源代码的这一行 ,了解它的工作原理。 您正在使用的DirectionalViewPager已弃用。

* 这并不意味着其他库也不支持垂直滚动,这意味着我只检查了其中一个。

After my comment to your question, I investigated one of the libraries I linked to. It turns out that this one* supports vertical scrolling content inside the vertical ViewPager. For your questions:

Can I capture the scroll events of the SwipeListView in a different way to work together with the scroll of the DirectionalViewPager?

You can subclass the ViewPager and override onInterceptTouchEvent(), stopping the ViewPager from moving to the next page until the ListView reaches scrolls to its last child.

It's posible to scroll with one finger to change inside the listview and with two fingers to scroll inside the DirectionalViewPager? If that's possible, ¿How can I do that?

It is possible, but I strongly suggest you don't do that. Think about your users and usability. Again, the key to this would be using onInterceptTouchEvent().

Do you have any other suggestion to solve this problem?

Yes. Use a different library, like I suggested earlier. This VerticalViewPager already handles it for you. See this line of the source code to see how it does. The DirectionalViewPager you're using is deprecated.

*This does not mean that the other library does not also support vertical scrolling, it means I only checked one of the two.

更多推荐

本文发布于:2023-08-04 05:02:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1409309.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:段内   VerticalViewPager   Android   ListView   Fragment

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!