Как устранить несоответствие номера позиции при быстрой прокрутке в RecyclerView? - PullRequest
0 голосов
/ 13 апреля 2019

В моем проекте Native Android я делаю один ридер.Итак, я использую один просмотр повторного просмотра для отображения текстового содержимого в карточках и в классе адаптера, внутри метода onBindViewHolder. Я использовал параметр position, чтобы отобразить pageNo, как показано ниже -

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)

Теперь это показываетСтраница №правильно, когда я прокручиваю медленно, но когда я прокручиваю быстро или прокручиваю в обратном направлении, иногда это показывает неправильное положение.У меня также есть один Seekbar в моем ридере, как показано ниже image-

enter image description here

Когда я перемещаюсь с одной конкретной страницы на страницу с расстоянием, используя панель поиска, тогдаон также неправильно получает позицию.

Вот часть xml для каждой строки в представлении recycler-

   <android.support.v7.widget.CardView
            xmlns:card_view="http://schemas.android.com/apk/res-auto"
            android:id="@+id/card_view_left"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            card_view:cardCornerRadius="5dp"
            card_view:contentPadding="10dp"
            card_view:cardBackgroundColor="@color/colorTransparent"
            card_view:cardElevation="4dp"
            card_view:cardMaxElevation="5dp"
            android:layout_marginBottom="12dp"
            android:layout_marginRight="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="-7dp"
            >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                >

            <TextView
                android:id="@+id/tvPageNo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"

                android:layout_gravity="right"
                android:text=""
                android:layout_marginRight="20dp"
                />

            <com.actinarium.aligned.TextView
                android:layout_marginStart="10dp"
                android:layout_marginEnd="10dp"
                android:id="@+id/tv_content"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"

                android:textAppearance="@style/TextAppearance.AppCompat.Body1"
                android:textSize="14sp"
                app:leading="16sp"
                app:firstLineLeading="24sp"
                android:layout_marginBottom="10dp"
                />

            </LinearLayout>

        </android.support.v7.widget.CardView>

И в классе RecyclerAdapter внутри onBindViewHolder я работал так -

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        ((ViewHolderText) holder).tvContent.setText("");

        if(preparedPage[position]==null){

            ((ViewHolderText) holder).loadingIndicator.smoothToShow();
            PageViewFragment.rvPageView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return true;
                }
            });

            //Prepare page item as spannable string
            Flowable.fromCallable(() -> preparePage(position)).subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(finalText -> {
                        ((ViewHolderText) holder).loadingIndicator.hide();

                        PageViewFragment.rvPageView.setOnTouchListener(new View.OnTouchListener() {
                            @Override
                            public boolean onTouch(View v, MotionEvent event) {
                                return false;
                            }
                        });

                        preparedPage[position] = finalText;

                        ((ViewHolderText) holder).tvContent.setText(finalText);
                        ((ViewHolderText) holder).tvPageNo.setText(""+holder.getAdapterPosition());

                    }, this::onError);

        }else {

            ((ViewHolderText) holder).loadingIndicator.hide();
            ((ViewHolderText) holder).tvContent.setText(preparedPage[position]);
            Log.d(TAG, "BOOK: "+preparedPage[position].length()+" "/*+preparedPage[position]*/);
        }

}

И я объявил один метод в своем классе фрагментов с именем updateView. Вот реализация этого -

private void updateView() {
    seekBar.setMax(pagesItems.size() - 1);
    seekBar.setOnProgressChangeListener(
            new DiscreteSeekBar.OnProgressChangeListener() {
                @Override
                public void onProgressChanged(DiscreteSeekBar seekBar, int value, boolean fromUser) {

                    tvPageNumber.setText((seekBar.getProgress() + 1) + " of " + pagesItems.size());
                }

                @Override
                public void onStartTrackingTouch(DiscreteSeekBar seekBar) {}

                @Override
                public void onStopTrackingTouch(DiscreteSeekBar seekBar) {

                    rvPageView.scrollToPosition(seekBar.getProgress());
                    CURRENT_PAGE = seekBar.getProgress();
                    saveBookSettings();
                }
            });

    Log.d(TAG, "updateView: " + CURRENT_PAGE + " " + bookSettings.toString());
    tvPageNumber.setText((CURRENT_PAGE + 1) + " of " + pagesItems.size());
    rvPageView.scrollToPosition(CURRENT_PAGE);
    seekBar.setProgress(CURRENT_PAGE);
}

Итак, как я могу отслеживать номер каждой карты в RecyclerView и правильно их показывать, покаслишком быстрая прокрутка или переключение с помощью seekbar?

1 Ответ

1 голос
/ 22 апреля 2019

попробуйте добавить только эту строку в свой Recycleradpater, это решит вашу проблему

    @Override
    public int getItemViewType(int position) {
        return position;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...