android中條目倒計時

網上對於這樣的功能已經是氾濫成河了,但是最近遇到這樣的一個需求,還是要值得我們學習一下,並將他記錄下來。

佈局文件:

<FrameLayout 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"
    tools:context="com.example.rui.demo.list_count_down.ListCountDownActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_list_count_down"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>
</FrameLayout>

Activity界面:

public class ListCountDownActivity extends AppCompatActivity {

    RecyclerView mRecyclerView;

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

    }

    private void initView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.rv_list_count_down);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        CountDownAdapter adapter = new CountDownAdapter();
        mRecyclerView.setAdapter(adapter);
        List<DataInfo> list = new ArrayList<>();
        for (int i = 1; i < 101; i++) {
            list.add(new DataInfo("我是條目" + i, i * 100));
        }
        adapter.setmDatas(list);
    }
}

倒計時條目適配器:

/**
 * @Date 2018/4/26
 * @Introduction 倒計時條目適配器
 */

public class CountDownAdapter extends RecyclerView.Adapter<CountDownAdapter.MyViewHoder> {

    private final String TAG = CountDownAdapter.class.getSimpleName();

    private final int STOP = 0x01;
    private final int START = 0x02;
    private final int LOOP = 0x03;

    private List<DataInfo> mDatas;

    public CountDownAdapter() {
    }

    public void setmDatas(List<DataInfo> mDatas) {
        this.mDatas = mDatas;
        notifyDataSetChanged();
    }

    @Override
    public MyViewHoder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new MyViewHoder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_count_down, parent, false));
    }

    @Override
    public void onBindViewHolder(final MyViewHoder holder, int position) {
        final DataInfo info = mDatas.get(position);
        holder.tvName.setText(info.getName());
        holder.tvTime.setText(info.getTime() + "");
        if (info.isCountDown()) {
            holder.btnStart.setText("停止");
        } else {
            holder.btnStart.setText("開始");
        }
        holder.btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Message msg = Message.obtain();
                if (!info.isCountDown()) {
                    holder.btnStart.setText("停止");
                    msg.what = START;
                } else {
                    holder.btnStart.setText("開始");
                    msg.what = STOP;
                }
                msg.obj = info;
                mHandler.sendMessage(msg);
                info.setCountDown(!info.isCountDown());
            }
        });
    }

    @Override
    public int getItemCount() {
        return mDatas == null ? 0 : mDatas.size();
    }

    static class MyViewHoder extends RecyclerView.ViewHolder {

        private final TextView tvName;
        private final TextView tvTime;
        private final Button btnStart;

        public MyViewHoder(View itemView) {
            super(itemView);
            tvName = (TextView) itemView.findViewById(R.id.tv_name_count_down_item);
            tvTime = (TextView) itemView.findViewById(R.id.tv_time_count_down_item);
            btnStart = (Button) itemView.findViewById(R.id.btn_time_count_down_item);
        }
    }

    private Handler mHandler = new Handler() {

        private List<DataInfo> mCountDownList = new ArrayList<>();

        @Override
        public void handleMessage(Message msg) {
            setChange(msg);
        }

        private synchronized void setChange(Message msg) {
            switch (msg.what) {
                case STOP:
                    DataInfo stopInfo = (DataInfo) msg.obj;
                    Log.e(TAG, "------------stop:" + stopInfo.getName());
                    mCountDownList.remove(stopInfo);
                    notifyDataSetChanged();
                    if (mCountDownList.size() <= 0) {
                        mHandler.removeCallbacksAndMessages(null);
                    }
                    break;
                case START:
                    DataInfo startInfo = (DataInfo) msg.obj;
                    Log.e(TAG, "------------start:" + startInfo.getName());
                    if (startInfo.getTime() > 0) {
                        mCountDownList.add(startInfo);
                        mHandler.sendEmptyMessageDelayed(LOOP, 1000);
                    }
                    break;
                case LOOP:
                    if (mCountDownList.size() <= 0) {
                        return;
                    }
                    for (Iterator<DataInfo> iterator = mCountDownList.iterator(); iterator.hasNext(); ) {
                        DataInfo dataInfo = iterator.next();
                        int time = dataInfo.getTime();
                        time--;
                        dataInfo.setTime(time);
                        if (time <= 0) {
                            iterator.remove();
                        }
                    }
                    notifyDataSetChanged();
                    mHandler.removeCallbacksAndMessages(null);
                    mHandler.sendEmptyMessageDelayed(LOOP, 1000);
                    break;
                default:
                    break;
            }
        }
    };
}

JavaBean類

/**
 * @Date 2018/4/26
 * @Introduction 倒計時數據實體類
 */

public class DataInfo {
    private String name;
    private int time;
    private boolean isCountDown = false;

    public DataInfo(String name, int time) {
        this.name = name;
        this.time = time;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getTime() {
        return time;
    }

    public void setTime(int time) {
        this.time = time;
    }

    public boolean isCountDown() {
        return isCountDown;
    }

    public void setCountDown(boolean countDown) {
        isCountDown = countDown;
    }
}

以上就是條目中倒計時的一個小Demo,歡迎大家指正,點評。

    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章