仿拼多多评团列表倒计时循环滚动 Android

仿拼多多评团列表倒计时循环滚动,每段时间自动滚动 Android 

 

 

现在开始动手撸代码

 

  • 首先要改下recyclerview的逻辑
package com.hugh.basis.rvlooper;

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.MotionEvent;

import java.lang.ref.WeakReference;

/**
 * Created by chenyw on 2019-08-15.
 */
public class AutoRollRecyclerView extends RecyclerView {

    private static final long TIME_AUTO_POLL = 3000;
    AutoPollTask autoPollTask;
    private boolean running; //表示是否正在自动轮询
    private boolean canRun;//表示是否可以自动轮询


    public AutoRollRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        autoPollTask = new AutoPollTask(this);
    }

    static class AutoPollTask implements Runnable {
        private int i = 3;
        private final WeakReference<AutoRollRecyclerView> mReference;

        //使用弱引用持有外部类引用->防止内存泄漏
        public AutoPollTask(AutoRollRecyclerView reference) {
            this.mReference = new WeakReference<AutoRollRecyclerView>(reference);
        }

        @Override
        public void run() {
            AutoRollRecyclerView recyclerView = mReference.get();
            if (recyclerView != null && recyclerView.running && recyclerView.canRun) {
                recyclerView.smoothScrollToPosition(i);
                i += 2;
                recyclerView.postDelayed(recyclerView.autoPollTask, TIME_AUTO_POLL);
            }
        }
    }

    //开启:如果正在运行,先停止->再开启
    public void start() {
        if (running)
            stop();
        canRun = true;
        running = true;
        postDelayed(autoPollTask, TIME_AUTO_POLL);
    }

    public void stop() {
        running = false;
        removeCallbacks(autoPollTask);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        switch (e.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_OUTSIDE:
                break;
        }
        return false;
    }
}

 

  • adapter 也要改下要改成无限大
package com.hugh.basis.rvlooper;

import android.graphics.Color;
import android.os.CountDownTimer;
import android.support.v7.widget.RecyclerView;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;


import com.hugh.basis.R;
import com.hugh.basis.rvlooper.bean.GroupBookingEntity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


/**
 * Created by chenyw on 2019-08-15.
 */
public class AutoRollAdapter extends RecyclerView.Adapter<AutoRollAdapter.BaseViewHolder> {
    HashMap<String, CountDownTimer> timerMap = new HashMap<>();
    ArrayList<String> timerKeyList = new ArrayList<>();
    private List<GroupBookingEntity> mData;


    public AutoRollAdapter(List<GroupBookingEntity> list) {
        this.mData = list;
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_group_booking_vh, parent, false);
        BaseViewHolder holder = new BaseViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(final BaseViewHolder holder, final int position) {
        final GroupBookingEntity data = mData.get(position % mData.size());
        holder.mTvName.setText(data.nickname);
        String allPeople = data.collage_people;
        String nowPeople = data.now_people;
        int leavePeople = Integer.valueOf(allPeople) - Integer.valueOf(nowPeople);
        long currenTime = Long.parseLong(data.current_time);
        long endTime = Long.parseLong(data.end_time);
        long seconds = endTime - currenTime;
        final String mCollageId = data.id;

        holder.mLayoutGoGourp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //去参团
            }
        });
        SpannableString spannableString = new SpannableString("还差" + leavePeople + "人成团");
        spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#FFFD4747")), 2, spannableString.length() - 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        holder.mTvleaveMembers.setText(spannableString);
        String id = data.id;
        if (!timerKeyList.contains(id)) {
            timerKeyList.add(id);
        }

        // -----一开始初始化数据

        if (holder.countDownTimer != null) {
            holder.countDownTimer.cancel();
        }
        holder.countDownTimer = new CountDownTimer(seconds * 1000, 1000) {
            public void onTick(long l) {
                holder.mTvCountDown.setText(getTimeStr(l));
            }

            public void onFinish() {
                //倒计时结束
//                holder.timeTv.setText("00:00");
            }
        }.start();
        timerMap.put(id, holder.countDownTimer);
    }

    private String getTimeStr(long l) {
        long day = l / (1000 * 24 * 60 * 60); //单位天
        long hour = (l - day * (1000 * 24 * 60 * 60)) / (1000 * 60 * 60); //单位时
        long minute = (l - day * (1000 * 24 * 60 * 60) - hour * (1000 * 60 * 60)) / (1000 * 60); //单位分
        long second = (l - day * (1000 * 24 * 60 * 60) - hour * (1000 * 60 * 60) - minute * (1000 * 60)) / 1000;//单位秒

        String hourStr = String.valueOf(hour);
        if (hourStr.length() == 1) {
            hourStr = "0" + hourStr;
        }
        String minStr = String.valueOf(minute);
        if (minStr.length() == 1) {
            minStr = "0" + minStr;
        }
        String secondStr = String.valueOf(second);
        if (secondStr.length() == 1) {
            secondStr = "0" + secondStr;
        }
        //如果day为0的时候天不显示
        if (day == 0) {
            return hourStr + ":" + minStr + ":" + secondStr;
        } else {
            return day + "天" + " " + hourStr + ":" + minStr + ":" + secondStr;
        }
    }


    @Override
    public int getItemCount() {
        return Integer.MAX_VALUE;
    }


    public void onDestroy() {
        for (int i = 0; i < timerKeyList.size(); i++) {
            if (timerKeyList.get(i) != null) {
                if (timerMap.get(timerKeyList.get(i)) != null) {
                    CountDownTimer timer = timerMap.get(timerKeyList.get(i));
                    if (timer != null) {
                        timer.cancel();
                    }
                }
            }
        }
    }


    class BaseViewHolder extends RecyclerView.ViewHolder {
        private TextView mTvCountDown;
        private ImageView mIvAvator;
        private TextView mTvName;
        private TextView mTvleaveMembers;
        private LinearLayout mLayoutGoGourp;
        private CountDownTimer countDownTimer;

        public BaseViewHolder(View view) {
            super(view);
            mIvAvator = view.findViewById(R.id.iv_avator);
            mTvName = view.findViewById(R.id.tv_name);
            mTvleaveMembers = view.findViewById(R.id.tv_leave_book);
            mTvCountDown = view.findViewById(R.id.tv_count_down);
            mLayoutGoGourp = view.findViewById(R.id.layout_go_group);
        }
    }


}

activity界面

 

package com.hugh.basis.rvlooper;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;

import com.hugh.basis.R;
import com.hugh.basis.rvlooper.bean.GroupBookingEntity;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by chenyw on 2019-08-15.
 */
public class LooperActivity extends AppCompatActivity {

    private AutoRollRecyclerView mRecyclerView;
    private List<GroupBookingEntity> list = new ArrayList<>();
    private AutoRollAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_looper_rv);
        initData();
        initView();
    }

    private void initData() {
        for (int i = 0; i < 5; i++) {
            GroupBookingEntity entity = new GroupBookingEntity();
            entity.nickname = "我是一个游客"+i;
            entity.collage_people = "10";
            entity.now_people = i+"";
            entity.end_time = "86400";
            entity.current_time =(100+i*30)+"";
            entity.id="id"+i;
            list.add(entity);
        }
    }

    private void initView() {
        mRecyclerView = (AutoRollRecyclerView) findViewById(R.id.rv_recycleView);
        mAdapter = new AutoRollAdapter(list);
        mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
        mRecyclerView.setAdapter(mAdapter);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        mRecyclerView.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != mRecyclerView) {
            mRecyclerView.stop();
        }
        if(mAdapter!=null){
            mAdapter.onDestroy();
        }
    }
}

 

  • 拼团展示的bean类
package com.hugh.basis.rvlooper.bean;

import java.io.Serializable;

/**
 * Created by chenyw on 2019-08-16.
 */
public class GroupBookingEntity implements  Serializable {
    public String id;
    public String now_people;
    public String end_time;
    public String collage_people;
    public String nickname;
    public String current_time;
}

 

以上就是完整的代码,要是还是有问题的话,可以参考下面的源码链接

源码传送门

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值