简体   繁体   中英

How to solve the Position number mismatch while scrolling fast in a RecyclerView?

In my Native Android project, I am making one reader . So, I am using one recyclerview to show the text content in cards and in the adapter class, inside the onBindViewHolder method, I have used parameter position to show the pageNo like below-

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

Now, It shows the Page no. correctly when I scroll slowly, but when I scroll fast or scroll in the reverse direction then sometimes it is showing wrong position. I also have one Seekbar in my reader like below image-

在此处输入图片说明

When I move from one specific page to a page with a distance using seekbar, then it is also getting the position incorrectly.

Here's the xml part for each row in the recyclerview-

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

And in the RecyclerAdapter class inside onBindViewHolder I have worked like that-

@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]*/);
        }

}

And I declared one method in my fragment class named updateView here's the implementation of that-

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

So, how can I track the number of each card in RecyclerView and show them correctly while scrolling too fast or changing with seekbar?

try to add just this line to your Recycleradpater this will solve your problem

    @Override
    public int getItemViewType(int position) {
        return position;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM