我的工程源码:https://github.com/xiaotian12-call/Take-body-temperature

所有知识

1、使用Room管理数据库。

2、使用ViewModel管理UI数据。

3、使用hellochart图表展示数据。

4、使用liveData管理数据库数据(观察者),时时更新界面数据。

设计思路

1、构建底层数据库。

2、UI设计(卡片视图界面,单个卡片界面,折线图表界面,录入体温界面,菜单界面)。

3、编写Navigation,将卡片视图界面,折线图表界面,录入体温界面加入其中,并确定界面跳转关系。

4、编写适配器,体温数据工厂。

5、编写ViewModel,通过‘工厂’操控数据。

6、完善各个界面的逻辑代码。

1)卡片视图界面,组件绑定,菜单绑定及菜单功能实现,界面跳转。

2)折线图表界面,根据数据库数据,封装好点,线,轴的相关数据。

3)录入体温界面,绑定组件,根据输入数据及当前系统时间更新数据库。

体温统计APP编写

1、构建底层数据库。

1)表结构

Android 温度传感器 android 温度监测_Android 温度传感器

 

 

 2)代码实体 :Entity

package com.me.temperature;

import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity(tableName = "temperature")
public class temperature {
    @PrimaryKey(autoGenerate = true)
    private int id;
    @ColumnInfo(name = "tp")
    private String tp;
    @ColumnInfo(name = "time")
    private String time;

    public temperature(String tp, String time) {
        this.tp = tp;
        this.time = time;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTp() {
        return tp;
    }

    public void setTp(String tp) {
        this.tp = tp;
    }

    public String getTime() {
        return time;
    }

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

3)Dao

package com.me.temperature;

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;

import java.util.List;
@Dao
public interface TempDao {
    @Insert
    void insertTp (temperature ... temperatures);
    @Update
    void updateTp (temperature ... temperatures);
    @Delete
    void deleteTp (temperature ... temperatures);
    @Query("DELETE From TEMPERATURE")
    void deleteAllTp ();
    @Query("SELECT * From TEMPERATURE ORDER BY ID DESC")
    LiveData<List<temperature>> getAllTp ();
}

4)Database

package com.me.temperature;

import android.content.Context;

import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;

@Database(entities = {temperature.class },version = 1,exportSchema = false)
public abstract class TempDatabase extends RoomDatabase {
    private static TempDatabase INSTANCE;
    public abstract TempDao getTempDao();
    static synchronized TempDatabase getTempDatabase(Context context){
        if (INSTANCE == null){
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(),TempDatabase.class,"tp_database")
                    .build();
        }
        return INSTANCE;
    }
}

2、UI设计(卡片视图界面,单个卡片界面,折线图表界面,录入体温界面,菜单界面)

1)卡片视图界面

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".AccountRecordFragment"
    android:id="@+id/frameLayout">

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/buttonTpAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center_horizontal"
        android:layout_margin="16dp"
        android:clickable="true"
        android:focusable="true"
        android:src="@drawable/ic_add_witer_24dp"
        tools:layout_conversion_absoluteHeight="56dp"
        tools:layout_conversion_absoluteWidth="56dp"
        tools:layout_editor_absoluteX="178dp"
        tools:layout_editor_absoluteY="659dp" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:layout_conversion_absoluteHeight="731dp"
        tools:layout_conversion_absoluteWidth="411dp"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="0dp" />
</FrameLayout>

2)单个卡片界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginBottom="4dp"
            android:foreground="?selectableItemBackground">

            <androidx.constraintlayout.widget.Guideline
                android:id="@+id/guideline"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                app:layout_constraintGuide_percent="0.1" />

            <TextView
                android:id="@+id/textViewId"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="36sp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@+id/guideline"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                tools:text="1" />

            <TextView
                android:id="@+id/textViewTp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:layout_marginBottom="8dp"
                android:textSize="36sp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@+id/textViewTime"
                app:layout_constraintHorizontal_bias="0.5"
                app:layout_constraintStart_toStartOf="@+id/guideline"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:id="@+id/textViewTime"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="32dp"
                android:layout_marginRight="32dp"
                android:textSize="24sp"
                app:layout_constraintBottom_toBottomOf="@+id/textViewTp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.5"
                app:layout_constraintStart_toEndOf="@+id/textViewTp"
                app:layout_constraintTop_toTopOf="@+id/textViewTp" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.cardview.widget.CardView>
</LinearLayout>

3)折线图表界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp">

    <lecho.lib.hellocharts.view.LineChartView
        android:id="@+id/chart"
        android:padding="20dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

4)录入体温界面

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/frameLayout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".AddFragment" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/add_title_tp"
        android:textSize="36sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.05" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="326dp"
        android:layout_height="262dp"
        android:layout_marginTop="8dp"
        android:contentDescription="@string/add_image"
        android:src="@drawable/temp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView"
        app:layout_constraintVertical_bias="0.05" />

    <Button
        android:id="@+id/buttonAdd"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginLeft="32dp"
        android:layout_marginEnd="32dp"
        android:layout_marginRight="32dp"
        android:text="@string/add_but"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.7" />

    <EditText
        android:id="@+id/editTextTp"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginLeft="32dp"
        android:layout_marginEnd="32dp"
        android:layout_marginRight="32dp"
        android:ems="10"
        android:hint="@string/add_tp_in"
        android:importantForAutofill="no"
        android:inputType="number"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.6" />

</androidx.constraintlayout.widget.ConstraintLayout>

5)菜单界面

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/clearAll"
        android:title="@string/menu_claer" />
    <item
        android:id="@+id/chart"
        android:title="@string/menu_chart" />
</menu>

3、编写Navigation,将卡片视图界面,折线图表界面,录入体温界面加入其中,并确定界面跳转关系。

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/navigation"
    app:startDestination="@id/investigationFragment">

    <fragment
        android:id="@+id/investigationFragment"
        android:name="com.me.temperature.InvestigationFragment"
        android:label="fragment_investigation"
        tools:layout="@layout/fragment_investigation" >
        <action
            android:id="@+id/action_investigationFragment_to_chartFragment"
            app:destination="@id/chartFragment" />
        <action
            android:id="@+id/action_investigationFragment_to_addFragment"
            app:destination="@id/addFragment" />
    </fragment>
    <fragment
        android:id="@+id/chartFragment"
        android:name="com.me.temperature.ChartFragment"
        android:label="fragment_chart"
        tools:layout="@layout/fragment_chart" />
    <fragment
        android:id="@+id/addFragment"
        android:name="com.me.temperature.AddFragment"
        android:label="fragment_add"
        tools:layout="@layout/fragment_add" >
        <action
            android:id="@+id/action_addFragment_to_investigationFragment"
            app:destination="@id/investigationFragment" />
    </fragment>
</navigation>

4、编写适配器,体温数据工厂。

1)适配器

package com.me.temperature;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

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

public class MyAdpter extends RecyclerView.Adapter <MyAdpter.MyViewHolder>{
    List<temperature> allTemperature = new ArrayList<>();
    public void setAllTemperature(List<temperature> allTemperature) {
        this.allTemperature = allTemperature;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View itemView = layoutInflater.inflate(R.layout.tp_cell,parent,false);
        MyViewHolder holder = new MyViewHolder(itemView);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });
        return holder;
    }


    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        temperature temperature = allTemperature.get(position);
        holder.textViewId.setText(String.valueOf(position+1));
        holder.textViewTime.setText(temperature.getTime());
        holder.textViewType.setText(temperature.getTp());
    }

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

    static class  MyViewHolder extends RecyclerView.ViewHolder{
        TextView textViewId,textViewType,textViewMoney,textViewTime;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            textViewId = itemView.findViewById(R.id.textViewId);
            textViewType = itemView.findViewById(R.id.textViewTp);
            textViewTime = itemView.findViewById(R.id.textViewTime);
        }
    }

}

2)工厂

package com.me.temperature;

import android.content.Context;
import android.os.AsyncTask;

import androidx.lifecycle.LiveData;

import java.util.List;

public class TpRepository {
    private LiveData<List<temperature>> allTemperature;
    private static List<temperature> allTemperatures;

    private TempDao tempDao;
    public TpRepository(Context context) {
        TempDatabase accountRecordDatabase = TempDatabase.getTempDatabase(context.getApplicationContext());
        tempDao = accountRecordDatabase.getTempDao();
        allTemperature = tempDao.getAllTp();
    }

    public LiveData<List<temperature>> getAllTemperature() {
        return allTemperature;
    }
    void insertTemperature(temperature ... temperatures){
        new InsertAsyncTask(tempDao).execute(temperatures);
    }
    void deleteAllTemperature(){
        new DeleteAsyncTask(tempDao).execute();
    }
    void deleteTemperature(temperature ... temperatures){
        new DeleteAsyncTask_2(tempDao).execute(temperatures);
    }
    static class InsertAsyncTask extends AsyncTask<temperature ,Void,Void> {
        private TempDao tempDao;

        public InsertAsyncTask(TempDao tempDao) {
            this.tempDao = tempDao;
        }

        @Override
        protected Void doInBackground(temperature... temperatures) {
            tempDao.insertTp(temperatures);
            return null;
        }
    }
    static class DeleteAsyncTask extends AsyncTask<Void ,Void,Void>{
        private TempDao tempDao;

        public DeleteAsyncTask(TempDao tempDao) {
            this.tempDao = tempDao;
        }

        @Override
        protected Void doInBackground(Void... Voids) {
            tempDao.deleteAllTp();
            return null;
        }
    }
    static class DeleteAsyncTask_2 extends AsyncTask<temperature ,Void,Void>{
        private TempDao tempDao;

        public DeleteAsyncTask_2(TempDao tempDao) {
            this.tempDao = tempDao;
        }

        @Override
        protected Void doInBackground(temperature... temperatures ) {
            tempDao.deleteTp(temperatures);
            return null;
        }
    }
}

编写ViewModel,通过‘工厂’操控数据。

package com.me.temperature;

import android.app.Application;

import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;

import java.util.List;

public class TpViewModel extends AndroidViewModel {
    private TpRepository tpRepository;

    public TpViewModel(@NonNull Application application) {
        super(application);
        tpRepository = new TpRepository((application));
    }

    public LiveData<List<temperature>> getAllTemperature() {
        return tpRepository.getAllTemperature();
    }

    void insertTemperature(temperature ... temperatures){
        tpRepository.insertTemperature(temperatures);
    }
    void deleteAllTemperature(){
        tpRepository.deleteAllTemperature();
    }
    void deleteTemperature(temperature ... temperatures){
        tpRepository.deleteTemperature(temperatures);
    }
}

完善各个界面的逻辑代码。

1)卡片视图界面,组件绑定,菜单绑定及菜单功能实现,界面跳转。

package com.me.temperature;


import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.List;


/**
 * A simple {@link Fragment} subclass.
 */
public class InvestigationFragment extends Fragment {
    private TpViewModel tpViewModel;
    private RecyclerView recyclerView;
    private MyAdpter myAdpter;
    private FloatingActionButton floatingActionButton;
    private LiveData<List<temperature>> findTemperature;
    private List<temperature> allTemperatures;
    public InvestigationFragment() {
        setHasOptionsMenu(true);
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_investigation, container, false);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {

        switch (item.getItemId()){
            case R.id.clearAll:
                AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
                builder.setTitle("清空账单");
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        tpViewModel.deleteAllTemperature();
                    }
                });
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
                builder.create();
                builder.show();
                break;
            case R.id.chart:
                NavController navController = Navigation.findNavController(requireActivity(),R.id.fragment);
                navController.navigate(R.id.action_investigationFragment_to_chartFragment);
        }
        return super.onOptionsItemSelected(item);
    }
    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.menu,menu);
    }
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        tpViewModel = ViewModelProviders.of(requireActivity()).get(TpViewModel.class);
        recyclerView = requireActivity().findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity()));
        myAdpter = new MyAdpter();
        recyclerView.setAdapter(myAdpter);
        findTemperature =  tpViewModel.getAllTemperature();
        findTemperature.observe(requireActivity(), new Observer<List<temperature>>() {
            @Override
            public void onChanged(List<temperature> temperatures) {
                allTemperatures = temperatures;
                myAdpter.setAllTemperature(temperatures);
                myAdpter.notifyDataSetChanged();
            }
        });
        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.START | ItemTouchHelper.END) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                temperature temperature = allTemperatures.get(viewHolder.getLayoutPosition());
                tpViewModel.deleteTemperature(temperature);
            }
        }).attachToRecyclerView(recyclerView);
        floatingActionButton = requireActivity().findViewById(R.id.buttonTpAdd);
        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                NavController navController = Navigation.findNavController(v);
                navController.navigate(R.id.action_investigationFragment_to_addFragment);
            }
        });
    }
}

2)折线图表界面,根据数据库数据,封装好点,线,轴的相关数据。

package com.me.temperature;


import android.graphics.Color;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import lecho.lib.hellocharts.model.Axis;
import lecho.lib.hellocharts.model.AxisValue;
import lecho.lib.hellocharts.model.Line;
import lecho.lib.hellocharts.model.LineChartData;
import lecho.lib.hellocharts.model.PointValue;
import lecho.lib.hellocharts.model.ValueShape;
import lecho.lib.hellocharts.util.ChartUtils;
import lecho.lib.hellocharts.view.LineChartView;


/**
 * A simple {@link Fragment} subclass.
 */
public class ChartFragment extends Fragment {
    private LineChartView mChart;
    private Map<String,String> table = new TreeMap<>();
    private LineChartData mData;
    private TpViewModel tpViewModel;
    private List<AxisValue> mAxisXValues = new ArrayList<AxisValue>();
    private List<AxisValue> values = new ArrayList<>();

    public ChartFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_chart, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mChart = view.findViewById(R.id.chart);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        tpViewModel = ViewModelProviders.of(requireActivity()).get(TpViewModel.class);
        mData = new LineChartData();
        List<temperature> allDate = tpViewModel.getAllTemperature().getValue();
        generateValues(allDate);
        generateData();
    }
    private void generateData() {
        List<Line> lines = new ArrayList<>();
        List<PointValue> values = new ArrayList<>();
        int indexX = 0;
        for(String value : table.values()){
            char [] chars = value.toCharArray();
            String string = "";
            if(chars.length>0){
                string += chars[0];
            }
            if(chars.length>1){
                string += chars[1];
            }
            values.add(new PointValue(indexX, Integer.valueOf(string)));
            indexX++;
        }
        Line line = new Line(values);
        line.setColor(ChartUtils.COLORS[0]);
        line.setShape(ValueShape.CIRCLE);
        line.setPointColor(ChartUtils.COLORS[1]);
        lines.add(line);
        mData.setLines(lines);
        setAxis();
        mChart.setLineChartData(mData);
    }

    private void generateValues(List<temperature> allDate) {
        if(allDate != null){
            for (int i = 0; i < allDate.size(); i++) {
                temperature costBean = allDate.get(i);
                String costDate = costBean.getTime();
                String costTp = costBean.getTp();
                //mAxisXValues.add(new AxisValue(allDate.size() - i - 1).setLabel(costDate));
                mAxisXValues.add(new AxisValue(i).setLabel(costDate));
                if(!table.containsKey(costDate)){
                    table.put(costDate,costTp);
                    //mAxisXValues.add(new AxisValue(i).setLabel(costDate));
                }else {
                    table.put(costDate,costTp);
                }
            }
        }
    }

    private void setAxis() {
        //坐标轴
        Axis axisX = new Axis(); //X轴
        axisX.setHasTiltedLabels(true);  //X坐标轴字体是斜的显示还是直的,true是斜的显示
        axisX.setTextColor(Color.GRAY);  //设置字体颜色
        axisX.setName("日期");  //表格名称
        axisX.setTextSize(10);//设置字体大小
        axisX.setMaxLabelChars(7); //最多几个X轴坐标,意思就是你的缩放让X轴上数据的个数7<=x<=mAxisXValues.length
        axisX.setValues(mAxisXValues);  //填充X轴的坐标名称
        mData.setAxisXBottom(axisX); //x 轴在底部
        //data.setAxisXTop(axisX);  //x 轴在顶部
        axisX.setHasLines(true); //x 轴分割线


        Axis axisY = new Axis().setHasLines(true);
        axisY.setMaxLabelChars(6);//max label length, for example 60

        for(int i = 35; i < 45; i+= 1){
            AxisValue value = new AxisValue(i);
            String label = i + "℃";
            value.setLabel(label);
            values.add(value);
        }
        axisY.setValues(values);
        axisY.setName("体温");//y轴标注
        axisY.setTextSize(10);//设置字体大小
        mData.setAxisYLeft(axisY);  //Y轴设置在左边
        //data.setAxisYRight(axisY);  //y轴设置在右边
    }
}

3)录入体温界面,绑定组件,根据输入数据及当前系统时间更新数据库。

package com.me.temperature;


import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.ViewModelProviders;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;

import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * A simple {@link Fragment} subclass.
 */
public class AddFragment extends Fragment {
    private Button buttonSubmit;
    private EditText editTextTp;
    private TpViewModel tpViewModel;

    public AddFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_add, container, false);
    }
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        FragmentActivity activity = requireActivity();
        tpViewModel = ViewModelProviders.of(activity).get(TpViewModel.class);
        buttonSubmit = activity.findViewById(R.id.buttonAdd);
        editTextTp = activity.findViewById(R.id.editTextTp);
        buttonSubmit.setEnabled(false);
        TextWatcher textWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                String type = editTextTp.getText().toString().trim();
                buttonSubmit.setEnabled(!type.isEmpty());

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        };
        editTextTp.addTextChangedListener(textWatcher);
        buttonSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String tp = editTextTp.getText().toString().trim();
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");// HH:mm:ss
                //获取当前时间
                Date date = new Date(System.currentTimeMillis());
                temperature temperature = new temperature(tp+"℃",simpleDateFormat.format(date));
                tpViewModel.insertTemperature(temperature);
                NavController navController = Navigation.findNavController(v);
                navController.navigate(R.id.action_addFragment_to_investigationFragment);
            }
        });
    }
}