在应用分页时保持倒数计时器 运行 而不影响 Recyclerview

To keep Count Down Timer running without affecting in Recyclerview when applied Pagination

我在 Recyclerview 的每个列表项中都有一个计时器,我为其应用了分页,这些都有效 fine.Now 例如,我的一个倒计时计时器是 02:50 分钟,我从 API 并在第 0 页绘制它,如果我向下滚动到分页中的其他页面并在 10 秒后返回到第 0 页,那么它应该是 02.39 或 02:40 但它再次占用旧的API 值并绘制 02:50 并再次开始倒计时,这是错误的。有什么方法可以使用分页处理 recyclerView 中的倒计时计时器。

// In Activity Pagination and a Call API method based on PageNo
        buyeroffer_rv.addOnScrollListener(new EndlessScrollListener(mLayoutManager) {
            @Override
            public void onLoadMore(int page, int totalItemsCount) {

                System.out.print("NUMPAGE_SCROLLED");
                System.out.print("PAge No"+page);


                progress_loader.setVisibility(View.VISIBLE);
                if (Internet.isConnectedToInternet()) {

                    pageno=page;
                    callApi(page);
                }
                else
                {
                    progress_loader.setVisibility(View.VISIBLE);
                    CustomToast.getInstance().toastMsg(activity,Internet.interNetMsg,ApiService.INTERNET_FLAG);
                }


            }
        });

然后在 BindViewHolder 上的 Recycle View Adapter 中从 API 秒中获取计时器,并根据该值启动计时器。

    // Adapter Code Snippet
    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {

        // Timer current value is fetched from API for each Item
        if (res.getTimeSloteOne() != null && !res.getTimeSloteOne().toString().isEmpty()) {
            timer = res.getTimeSloteOne();
        }

        // Here based on activeFlag hide or show Timer text
        if ((activeflag.equalsIgnoreCase("0") && !res.getBidtype().toString().equalsIgnoreCase("5")) || (activeflag.equalsIgnoreCase("4")) && (res.getBidtype().toString().equalsIgnoreCase("0") || res.getBidtype().toString().equalsIgnoreCase("0.0"))) {
            if (timer > 0) {
                timer = timer * 1000;
                holder.timer = new CountDownTimer(timer, 1000) {
                    public void onTick(long millisUntilFinished) {

                        holder.timmertext.setText("" + String.format(FORMAT,
                                TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(
                                        TimeUnit.MILLISECONDS.toHours(millisUntilFinished)),
                                TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(
                                        TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))));

                        if (TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)) >= 30) {
                            holder.timmertext.setTextColor(activity.getResources().getColor(R.color.timer1));
                        } else if (TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)) >= 10 &&
                                TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)) < 30) {
                            holder.timmertext.setTextColor(activity.getResources().getColor(R.color.timer2));
                        } else if (TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)) < 10) {
                            holder.timmertext.setTextColor(activity.getResources().getColor(R.color.timer3));
                        }
                    }

                    public void onFinish() {
                        holder.timmertext.setText("00:00");
                        holder.timmertext.setTextColor(activity.getResources().getColor(R.color.color_black));
                    }
                }.start();
            }
        }
        else {
            // 
            holder.timmertext.setVisibility(View.GONE);
        }
    }
}

// XML 为 Activity

<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".uibuyer.BuyerOfferAct"
    android:background="#f0f0f0">
   <android.support.v4.widget.SwipeRefreshLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/swipe_layout"
                android:background="#e6e6e6"
                android:layout_marginBottom="50dp">
                <android.support.v7.widget.RecyclerView
                    android:id="@+id/recycler_view"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_marginBottom="50dp"
                    android:clipToPadding="false"
                    android:paddingBottom="10dp" />
            </android.support.v4.widget.SwipeRefreshLayout>
            <RelativeLayout
                android:id="@+id/loader_lay"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/loader_bg"
                android:layout_below="@+id/toolbar_container"
                android:layout_marginBottom="50dp"
                android:visibility="gone">
                <include
                    android:id="@+id/loader"
                    layout="@layout/common_loader"
                    />
            </RelativeLayout>
</RelativeLayout>

在 Adapter 中布局片段

           <com.xelpmoc.zommodity.utils.TextViewWithFont
            android:id="@+id/time_lft_txt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Time Left"
            android:textAlignment="textEnd"
            android:textAllCaps="true"
            android:textColor="@color/texttwo"
            android:textSize="@dimen/font8"
            font:name="FONT_OPENSANS_BOLD" />

        <com.xelpmoc.zommodity.utils.TextViewWithFont
            android:id="@+id/timmertext"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="03:50"
            android:textAlignment="textEnd"
            android:textAllCaps="true"
            android:textSize="15dp"
            font:name="FONT_OPENSANS_BOLD" />

        <com.xelpmoc.zommodity.utils.TextViewWithFont
            android:id="@+id/time_mins"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="MINS"
            android:textAlignment="viewEnd"
            android:textAllCaps="true"
            android:textColor="@color/text_one"
            android:textSize="11dp"
            font:name="FONT_OPENSANS_BOLDITALIC" />

首先我们必须在 viewHolder 中创建一个布尔变量,我们必须将其设置为 false。

 public class MyViewHolder extends RecyclerView.ViewHolder {
              boolean timerflag=false;
          CountDownTimer timer;
                    public MyViewHolder(View view) {
                        super(view);
            }
            }

我在 BindViewHolder 上,我们必须处理标志

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        if (holder.timerflag == false) {

            if (holder.timer != null) {
                holder.timer.cancel();
            }


            if (timeslot != null) {
                timer = timeslot;
                holder.timerflag = true;
            }


            if (timer > 0) {
                timer = timer * 1000;
                holder.timer = new CountDownTimer(timer, 1000) {
                    public void onTick(long millisUntilFinished) {

                        //do the task
                    }

                    public void onFinish() {

                    }
                }.start();
            }
        }
}