В моем проекте Native Android я делаю один ридер.Итак, я использую один просмотр повторного просмотра для отображения текстового содержимого в карточках и в классе адаптера, внутри метода onBindViewHolder. Я использовал параметр position, чтобы отобразить pageNo, как показано ниже -
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
Теперь это показываетСтраница №правильно, когда я прокручиваю медленно, но когда я прокручиваю быстро или прокручиваю в обратном направлении, иногда это показывает неправильное положение.У меня также есть один Seekbar в моем ридере, как показано ниже image-
Когда я перемещаюсь с одной конкретной страницы на страницу с расстоянием, используя панель поиска, тогдаон также неправильно получает позицию.
Вот часть 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?