gpt4 book ai didi

android - 滚动时 RecyclerView 中的多个倒数计时器闪烁

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:09 29 4
gpt4 key购买 nike

我已经为 fragment Activity 中的 RecyclerView 的每个项目实现了倒数计时器。倒数计时器显示到期的剩余时间。倒数计时器工作正常,但向上滚动时开始闪烁。搜索了很多但没有得到很好的引用。谁能帮帮我?

这是我的 RecyclerView 适配器

public class MyOfferAdapter extends RecyclerView.Adapter<MyOfferAdapter.FeedViewHolder>{
private final Context mContext;
private final LayoutInflater mLayoutInflater;
private ArrayList<Transactions> mItems = new ArrayList<>();
private ImageLoader mImageLoader;
private String imageURL;
private View mView;
private String mUserEmail;

public MyOfferAdapter(Context context) {
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
VolleySingleton mVolley = VolleySingleton.getInstance(mContext);
mImageLoader = mVolley.getImageLoader();
}


public void addItems(ArrayList<Transactions> items,String userEmail) {
int count = mItems.size();
mItems.addAll(items);
mUserEmail = userEmail;
notifyItemRangeChanged(count, items.size());
}


@Override
public FeedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
mView = mLayoutInflater.inflate(R.layout.my_feed_item_layout, parent, false);
return new FeedViewHolder(mView);
}

@Override
public void onBindViewHolder(final FeedViewHolder holder, final int position) {
holder.desc.setText(mItems.get(position).getDescription());//replace by title
holder.scratchDes.setText(mItems.get(position).getScratchDescription());

long timer = mItems.get(position).getTimerExpiryTimeStamp();
Date today = new Date();
final long currentTime = today.getTime();
long expiryTime = timer - currentTime;


new CountDownTimer(expiryTime, 500) {
public void onTick(long millisUntilFinished) {
long seconds = millisUntilFinished / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;
String time = days+" "+"days" +" :" +hours % 24 + ":" + minutes % 60 + ":" + seconds % 60;
holder.timerValueTimeStamp.setText(time);
}

public void onFinish() {
holder.timerValueTimeStamp.setText("Time up!");
}
}.start();

}

@Override
public int getItemCount() {
return mItems.size();
}

public static class FeedViewHolder extends RecyclerView.ViewHolder {
TextView desc;
TextView scratchDes;
TextView timerValueTimeStamp;
ImageView feedImage;
CardView mCv;

public FeedViewHolder(View itemView) {
super(itemView);
mCv = (CardView) itemView.findViewById(R.id.cv_fil);
desc = (TextView) itemView.findViewById(R.id.desc_tv_fil);
feedImage = (ImageView) itemView.findViewById(R.id.feed_iv_fil);
scratchDes = (TextView) itemView.findViewById(R.id.tv_scratch_description);
timerValueTimeStamp = (TextView) itemView.findViewById(R.id.tv_timer_value_time_stamp);

}

}

这是我在适配器中使用的 xml 文件

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cv_fil"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/card_margin"
android:layout_gravity="center"
app:cardUseCompatPadding="true"
app:cardElevation="4dp"
android:elevation="6dp">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
android:id="@+id/feed_iv_fil"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_alignParentTop="true"
android:scaleType="fitXY"
android:tint="@color/grey_tint_color" />

<TextView
android:id="@+id/tv_scratch_description"
style="@style/ListItemText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="casul shoes"
android:fontFamily="sans-serif-light"
android:padding="10dp" />


<TextView
android:id="@+id/tv_timer_value_time_stamp"
style="@style/CardTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>

<TextView
android:id="@+id/desc_tv_fil"
style="@style/VendorNameText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/feed_iv_fil"
android:textColor="#3f3e3f"
android:padding="10dp"
/>

</RelativeLayout>


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

这是我的 RecyclerView 的屏幕截图 enter image description here

最佳答案

这个问题很简单。

RecyclerView 重用 holders,每次调用 bind 更新其中的数据。

由于每次绑定(bind)任何数据时都会创建一个 CountDownTimer,因此您最终会得到多个计时器更新同一个 ViewHolder

这里最好的办法是移动 FeedViewHolder 中的 CountDownTimer 作为引用,在绑定(bind)数据(如果已启动)之前取消它并重新安排到所需的持续时间.

public void onBindViewHolder(final FeedViewHolder holder, final int position) {
...
if (holder.timer != null) {
holder.timer.cancel();
}
holder.timer = new CountDownTimer(expiryTime, 500) {
...
}.start();
}

public static class FeedViewHolder extends RecyclerView.ViewHolder {
...
CountDownTimer timer;

public FeedViewHolder(View itemView) {
...
}
}

这样您将在启动另一个计时器之前取消该 ViewHolder 的任何当前计时器实例。

关于android - 滚动时 RecyclerView 中的多个倒数计时器闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38890863/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com