Горизонтальный RecylerView выглядит как ViewPager

Я пытаюсь преобразовать горизонтальный RecylerView в ViewPager.
(работает как горизонтальный RecylerView, выглядит как ViewPager)

Я работаю над существующим проектом, в котором горизонтальный RecylerView уже используется и отлично работает в соответствии с требованиями, но мне нужно изменить его дизайн, поскольку RecylerView горизонтальный, должен отображаться только один элемент за раз, поэтому для лучшего понимания пользователя мне нужно добавить один линейный макет под элементом, который показывает индикатор (так же, как ViewPager) общего количества элементов в RecylerView. цель индикатора, он показывает текущий существующий элемент в RecylerView.

Мой вопрос: Как получить текущую позицию элемента в индикаторе при прокрутке в горизонтальном просмотре?

Попробуй и ошибись:

Я не знаю, как получить позицию текущего элемента при прокрутке?
(я получаю позицию элемента при нажатии на элемент)

Я могу использовать viewpager вместо горизонтального recylerview, но мне нужно изменить его во многих местах (время и усилия).
(я уже установил индикатор в соответствии с общим элементом, но я не могу получить позицию элемента)

введите здесь описание изображения

введите здесь описание изображения

Примечание: одновременно отображается только один элемент

Заранее спасибо.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity"
    android:background="#f7eaf9">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#fd7d7d">
    </android.support.v7.widget.RecyclerView>

    <LinearLayout
        android:id="@+id/linlay_pager"
        android:layout_margin="10dp"
        android:layout_below="@+id/recycler_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:orientation="horizontal"/>
</RelativeLayout>

MainActivity.java

package com.horizontalrecyclerview;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.os.Bundle;
import android.support.graphics.drawable.VectorDrawableCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SnapHelper;
import android.view.Gravity;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    private Context mContext;
    private Activity mActivity;
    private Button pre;
    private RelativeLayout mRelativeLayout;
    private RecyclerView mRecyclerView;
    private RecyclerView.LayoutManager mLayoutManager;
    private RecyclerView.Adapter mAdapter;
    private Random mRandom = new Random();
    private LinearLayout linlay_pager;
    private VectorDrawableCompat mVectorPagerFillCircle;
    private VectorDrawableCompat mVectorPagerCircle;

    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            int receivedColor = intent.getIntExtra("Color", Color.WHITE);
            mRelativeLayout.setBackgroundColor(receivedColor);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        linlay_pager= (LinearLayout) findViewById(R.id.linlay_pager);
        mVectorPagerFillCircle = VectorDrawableCompat.create(getResources(), R.drawable.ic_pager_fill_circle, null);
        mVectorPagerCircle = VectorDrawableCompat.create(getResources(), R.drawable.ic_pager_circle, null);
        mContext = getApplicationContext();
        mActivity = MainActivity.this;
        LocalBroadcastManager.getInstance(mContext).registerReceiver(
                mBroadcastReceiver,
                new IntentFilter("BROADCAST_COLOR")
        );
        mRelativeLayout = (RelativeLayout) findViewById(R.id.rl);
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

        SnapHelper snapHelper = new GravitySnapHelper(Gravity.START);
        snapHelper.attachToRecyclerView(mRecyclerView);

        mLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
        mRecyclerView.setLayoutManager(mLayoutManager);

        List<String> colors = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            colors.add(getRandomHSVColor() + "");
        }

        LinearLayout.LayoutParams imParams = new LinearLayout.LayoutParams(ViewPager.LayoutParams.WRAP_CONTENT, ViewPager.LayoutParams.WRAP_CONTENT);
        for (int i = 0; i < 5; i++) {
            ImageView mImageCirclePager = new ImageView(this);
            if (i == 0) {
                mImageCirclePager.setImageDrawable(mVectorPagerFillCircle);
            } else {
                mImageCirclePager.setImageDrawable(mVectorPagerCircle);
            }
            linlay_pager.addView(mImageCirclePager, imParams);
        }

        mAdapter = new ColorsAdapter(mContext, colors);
        mRecyclerView.setAdapter(mAdapter);
    }

    public int getRandomHSVColor() {
        int hue = mRandom.nextInt(361);
        float saturation = 1.0f;
        float value = 1.0f;
        int alpha = 255;
        int color = Color.HSVToColor(alpha, new float[]{hue, saturation, value});
        return color;
    }
}

person Rucha Bhatt Joshi    schedule 30.03.2017    source источник
comment
попробуйте этот stackoverflow.com/questions/24989218/ Надеюсь, вы получите подсказку :)   -  person Anand Savjani    schedule 30.03.2017
comment
для индикатора пейджера вы можете попробовать этот android-arsenal.com/details/1/5462   -  person Anand Savjani    schedule 30.03.2017
comment
привет @AnandSavjani, ссылка Arsenal предназначена для просмотра пейджера, но у меня есть recyclerview и другие ответы на stackoverflow, которые я уже пробовал .. Спасибо за ваши усилия. :)   -  person Rucha Bhatt Joshi    schedule 30.03.2017
comment
для решения проблемы с индикатором необходимо создать ручной индикатор. Это фиксированный размер или динамический?   -  person Anand Savjani    schedule 30.03.2017
comment
я уже сделал, что он динамический, индикатор уже создан, но в соответствии с индикатором изменения элемента он должен меняться, как просмотр пейджера.. как получить позицию элемента после прокрутки?   -  person Rucha Bhatt Joshi    schedule 30.03.2017
comment
Я разместил первую ссылку, чтобы получить последнюю видимую позицию элемента. Пожалуйста, проверь это . Надеюсь, вы получите некоторое представление :)   -  person Anand Savjani    schedule 30.03.2017
comment
@AnandSavjani да, я проверил, layoutManager.findFirstVisibleItemPosition(); всегда дает мне -1 позицию..   -  person Rucha Bhatt Joshi    schedule 03.04.2017
comment
Попробуйте получить lastvisibleitemposition() или findLastCompletelyVisibleItemPosition   -  person Anand Savjani    schedule 03.04.2017
comment
@AnandSavjani спасибо за помощь..   -  person Rucha Bhatt Joshi    schedule 05.04.2017
comment
Ваше решение для фиксированного размера. Отправьте свой ответ для динамического размера :)   -  person Anand Savjani    schedule 05.04.2017
comment
Привет, Как уменьшить размер индикаторов Recyclerview?   -  person Naveen    schedule 23.06.2020


Ответы (1)


Я нашел решение, эти два метода облегчают мою работу.

 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                int pos = ((LinearLayoutManager)(recyclerView.getLayoutManager())).findFirstVisibleItemPosition();
                btnAction(pos,5);
            }
        }); 




private void btnAction(int position, int bannerListSize) {
            for (int i = 0; i < bannerListSize; i++) {
                ImageView imageView = (ImageView) linlay_pager.getChildAt(i);
                if (i == position) {
                    imageView.setImageDrawable(mVectorPagerFillCircle);
                } else {
                    imageView.setImageDrawable(mVectorPagerCircle);
                }
            }
        }

Примечание. Мы можем использовать его вместо окна просмотра, когда нам нужно показать только один элемент.

person Rucha Bhatt Joshi    schedule 05.04.2017
comment
возможно ли, что следующий и предыдущий элемент также видны - person Aditya Vyas-Lakhan; 05.04.2017
comment
наконец-то вы нашли решение :) - person Anand Savjani; 05.04.2017
comment
@AdityaVyas-Lakhan, я не могу получить то, что ты хочешь! Пожалуйста, объясни.. :) - person Rucha Bhatt Joshi; 05.04.2017
comment
@ AdityaVyas-Lakhan Мое требование показывать только один элемент за раз, поэтому я использовал одну библиотеку, которая вычисляет расстояние при прокрутке и настраивает элемент в соответствии с расстоянием и показывает только один элемент в контейнере. В вашем случае может быть возможно показать следующий и предыдущие элементы, но, возможно, вы не получите точное положение элемента .. позвольте мне проверить :) - person Rucha Bhatt Joshi; 05.04.2017
comment
о, хорошо, это означает, что с помощью recyclerview будет сложно получить позицию для этого .. спасибо - person Aditya Vyas-Lakhan; 05.04.2017
comment
@ AdityaVyas-Lakhan, как ты решил свою проблему? я также хочу показать следующий и предыдущий элемент ?? - person Erum; 25.08.2017