Слушатель касания мешает прокрутке RecyclerView - PullRequest
0 голосов
/ 07 февраля 2020

Мое приложение выглядит так:

В основном это FrameLayout для размещения фрагментов и просмотра Bottom Nav. Теперь я хотел бы реализовать жест смахивания вправо в HomeFragment (когда выбрана вкладка Home). Но этот фрагмент содержит RecyclerView. Чтобы добавить прокрутку вправо, я использую:

public class OnSwipeTouchListener implements View.OnTouchListener {

    private final GestureDetector gestureDetector;

    public OnSwipeTouchListener (Context ctx){
        gestureDetector = new GestureDetector(ctx, new GestureListener());
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }

    private final class GestureListener extends GestureDetector.SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            boolean result = false;
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            onSwipeRight();
                        } else {
                            onSwipeLeft();
                        }
                        result = true;
                    }
                }
                else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        onSwipeBottom();
                    } else {
                        onSwipeTop();
                    }
                    result = true;
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return result;
        }
    }

    public void onSwipeRight() {
    }

    public void onSwipeLeft() {
    }

    public void onSwipeTop() {
    }

    public void onSwipeBottom() {
    }
}

Когда я добавляю этот сенсорный слушатель в RecyclerView, прокрутка не происходит гладко. Я не знаю причину этого. Пожалуйста, объясните, если у вас есть.

Теперь, пожалуйста, предложите, что я должен сделать, чтобы преодолеть проблему. Есть ли какой-либо другой способ настроить прослушиватель касания и прослушиватель жестов, чтобы прокрутка не была затруднена, а также чтобы я мог обнаружить жест смахивания вправо? обнаруживает жест, но просмотрщик не выполняет прокрутку.

Ответы [ 3 ]

1 голос
/ 11 февраля 2020

Попробуйте настроить прослушиватель для развернутого представления в onCreateViewHold () . Что-то вроде

public @NonNull
RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_message, parent, false);
    view.setOnTouchListener(new OnSwipeTouchListener(view.getContext()));
    return new ItemViewHolder(view);
}

Удалите прослушиватель из самого RecyclerView.

0 голосов
/ 16 февраля 2020

вы можете просто изменить FrameLayout с помощью ViewPager и добавить прослушиватель для действия смахивания

изменить FrameLayout на ViewPager

 <android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_below="@id/tab_layout"/>

Implement PagerAdapter

public class PagerAdapter extends FragmentStatePagerAdapter {
int fragmentNumber;

public PagerAdapter(FragmentManager fm, int fragmentNumber) {
    super(fm);
    this.fragmentNumber = fragmentNumber;
}

/**
 * Return the Fragment associated with a specified position.
 *
 * @param position
 */
@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return new Fragment1();
        case 1:
            return new Fragment2();
        case 2:
            return new Fragment3();
        case 3:
            return new Fragment4();
        case 4:
            return new Fragment5();
        default:
            return null;
    }
}


/**
 * Return the number of views available.
 */
@Override
public int getCount() {
    return fragmentNumber;
}
}

MainActivity Logi c

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ViewPager viewPager = findViewById(R.id.pager);
    final PagerAdapter adapter = new PagerAdapter
            (getSupportFragmentManager(), 5); //Change the number based on the number of Fragments you have
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            // put your scrolling logic here. use positionOffset and position to determine the next destination
        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
}

вы также можете связать ваш viewPager с bottomNavigation для согласованности, и этот код может быть изменен на основе вашего конкретный c case: отслеживание невидимых фрагментов вместо искажения их .....

Надеюсь, это было полезно.

0 голосов
/ 10 февраля 2020

Я не совсем уверен, что вы хотите, но использовать функцию пролистывания влево или вправо во фрагментах android. Вы можете установить текущую страницу на последнюю страницу, используя viewPager.setCurrentItem () в MainActivity. ViewPager - это виджет, который позволяет пользователю проводить пальцем влево или вправо, чтобы увидеть совершенно новый экран. Я надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...