gpt4 book ai didi

android - 带倒数计时器的 ListView。滚动 ListView 时调光器闪烁

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:57:05 26 4
gpt4 key购买 nike

在我的应用程序中,我必须为 ListView 中的每个项目显示倒数计时器。我已经能够使用 CountDownTimer 执行此操作。但是,问题是向上或向下滚动 ListView 时,计时器开始闪烁。搜索了很多但找不到解决方案。

我的适配器类

public class BuyListingListAdapter extends BaseAdapter  {

private Context mContext;
private ArrayList<VehicleAttributes> mVehicleList = new ArrayList<VehicleAttributes>();
private Date currentDate;
//Saving position in map to check if timer has been //started for this row
private HashMap<Integer, Boolean> timerMap = new HashMap<Integer, Boolean>();

public BuyListingListAdapter(Context context,
ArrayList<VehicleAttributes> vehicleList, boolean showGridView) {
this.mContext = context;
this.mVehicleList = vehicleList;
this.showGridView = showGridView;
currentDate = new Date(System.currentTimeMillis());

int listSize = mVehicleList.size();
for (int i = 0; i < listSize; i++)
timerMap.put(i, false);
}

@Override
public int getCount() {
return mVehicleList.size();
}

@Override
public Object getItem(int position) {
return mVehicleList.get(position);
}

@Override
public long getItemId(int position) {
return 0;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.row_buy_listing_grid,
parent, false);
holder = new ViewHolder();
holder.timer_layout = (LinearLayout) convertView
.findViewById(R.id.timer_layout);
holder.txt_remaining_days = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_days);
holder.txt_remaining_hours = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_hours);
holder.txt_remaining_mins = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_mins);
holder.txt_remaining_secs = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_secs);
holder.listing_status = (ImageView) convertView
.findViewById(R.id.listing_status);

convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();

final VehicleAttributes vehicleAttributes = mVehicleList.get(position);

AuctionModel mAuctionModel = vehicleAttributes.getAuctionDetailModel();
if (mAuctionModel != null) {
holder.img_auction.setVisibility(View.VISIBLE);

Date auctionStartDate = Util
.getDateFromString(mAuctionModel.getStarted_at(),
"yyyy-MM-dd hh:mm:ss", "GMT");
Date auctionEndDate = Util.getDateFromString(
mAuctionModel.getEnded_at(), "yyyy-MM-dd hh:mm:ss", "GMT");
long diff = currentDate.getTime() - auctionEndDate.getTime();

if (diff < 0)
diff = -diff;
else
diff = 0;

if (timerMap.get(position) == null || !timerMap.get(position)) {

timerMap.put(position, true);
MyCountDown countDown = new MyCountDown(position, diff, 1000,
holder.txt_remaining_days, holder.txt_remaining_hours,
holder.txt_remaining_mins, holder.txt_remaining_secs);
countDown.start();
}
}
return convertView;
}

private class MyCountDown extends CountDownTimer {
RobotoCondensedBoldTextView txt_remaining_days;
RobotoCondensedBoldTextView txt_remaining_hours;
RobotoCondensedBoldTextView txt_remaining_mins;
RobotoCondensedBoldTextView txt_remaining_secs;
int position;

public MyCountDown(int position, long millisInFuture, long countDownInterval,
RobotoCondensedBoldTextView txt_remaining_days,
RobotoCondensedBoldTextView txt_remaining_hours,
RobotoCondensedBoldTextView txt_remaining_mins,
RobotoCondensedBoldTextView txt_remaining_secs) {
super(millisInFuture, countDownInterval);
this.position = position;
this.txt_remaining_days = txt_remaining_days;
this.txt_remaining_hours = txt_remaining_hours;
this.txt_remaining_mins = txt_remaining_mins;
this.txt_remaining_secs = txt_remaining_secs;
}

@Override
public void onFinish() {

}

@Override
public void onTick(long millisUntilFinished) {
updateTimerLabel(position, millisUntilFinished, txt_remaining_days,
txt_remaining_hours, txt_remaining_mins, txt_remaining_secs);
}
}

private void updateTimerLabel(int position, long millis,
RobotoCondensedBoldTextView txt_remaining_days,
RobotoCondensedBoldTextView txt_remaining_hours,
RobotoCondensedBoldTextView txt_remaining_mins,
RobotoCondensedBoldTextView txt_remaining_secs) {
String days = String.format("%02d",
TimeUnit.MILLISECONDS.toDays(millis));
String hours = String.format(
"%02d",
TimeUnit.MILLISECONDS.toHours(millis)
- TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS
.toDays(millis)));
String mins = String.format(
"%02d",
TimeUnit.MILLISECONDS.toMinutes(millis)
- TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS
.toHours(millis)));
String secs = String.format(
"%02d",
TimeUnit.MILLISECONDS.toSeconds(millis)
- TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS
.toMinutes(millis)));

txt_remaining_days.setText(days);
txt_remaining_hours.setText(hours);
txt_remaining_mins.setText(mins);
txt_remaining_secs.setText(secs);
}

static class ViewHolder {
NetworkImageView mVehicleImage;
RobotoCondensedBoldTextView txt_remaining_days, txt_remaining_hours,
txt_remaining_mins, txt_remaining_secs;
LinearLayout timer_layout;
}
}

最佳答案

好吧,我们先说说问题

if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.row_buy_listing_grid,
parent, false);
holder = new ViewHolder();
holder.timer_layout = (LinearLayout) convertView
.findViewById(R.id.timer_layout);
holder.txt_remaining_days = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_days);
holder.txt_remaining_hours = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_hours);
holder.txt_remaining_mins = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_mins);
holder.txt_remaining_secs = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_secs);
holder.listing_status = (ImageView) convertView
.findViewById(R.id.listing_status);

convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();

上面 ListView 中的代码将重用组件的项目,例如,当我们加载列表时,列表中只显示 6 个项目, ListView 创建这些项目,但是当您上下滚动而不是创建新项目时它将为下一个位置重用相同的 View ,因此当您将 View 传递给倒计时计时器以更新时间时,相同的 View 会使用不同的倒计时计时器进行更新

现在解决方案是什么,您必须弄清楚哪些项目 View 在屏幕上可见,并停止其他 View 的倒数计时器。或者有一个非常简单的方法,但不推荐,因为它可能会导致内存问题

    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.row_buy_listing_grid,
parent, false);
holder = new ViewHolder();
holder.timer_layout = (LinearLayout) convertView
.findViewById(R.id.timer_layout);
holder.txt_remaining_days = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_days);
holder.txt_remaining_hours = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_hours);
holder.txt_remaining_mins = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_mins);
holder.txt_remaining_secs = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_secs);
holder.listing_status = (ImageView) convertView
.findViewById(R.id.listing_status);

convertView.setTag(holder);

简单地删除 if(convertview==null) 并允许为每一行扩充一个新 View 。

关于android - 带倒数计时器的 ListView。滚动 ListView 时调光器闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30931873/

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