2021-05-20

记事本应用

activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fefefe">
<!--   TextView控件用于显示界面标题,-->

    <TextView
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:id="@+id/note_name"
        android:textSize="20sp"
        android:textColor="@android:color/white"
        android:gravity="center"
        android:textStyle="bold"
        android:background="#FFB6C1"
        android:text="记事本"/>

<!--    ListView控件用于显示记录列表,-->
    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listview"
        android:divider="#E4E4E4"
        android:cacheColorHint="#00000000"
        android:dividerHeight="1dp"
        android:fadingEdge="none"
        android:listSelector="#00000000"
        android:scrollbars="none"
        android:layout_below="@+id/note_name">
    </ListView>

<!--    ImageView控件用于显示添加按钮的图片-->
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/add"
        android:src="@drawable/add"
        android:layout_marginBottom="30dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

notepad_item_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingLeft="12dp">
<!-- 放置2个TextView控件,分别用于显示记录的部分内容与保存记录的时间-->

    <TextView
        android:id="@+id/item_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:maxLines="2"
        android:ellipsize="end"
        android:lineSpacingExtra="3dp"
        android:paddingTop="10dp"
        android:textColor="@android:color/black"/>
    <TextView
    android:id="@+id/item_time"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="#fb7a6a"
    android:paddingTop="5dp"
    android:paddingBottom="7dp"/>
</LinearLayout>

DBUtils 类

package cn.itcast.notepad.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
//定义数据库的名称、表名、数据库版本、数据库表中的列名以及获取当前日期等信息,

public class DBUtils {
    public static final String DATABASE_NAME = "Notepad";//数据库名
    public static final String DATABASE_TABLE = "Note";//表名
    public static final int DATABASE_VERION =1;//数据库版本
//数据库表中的列名
    public static final String NOTEPAD_ID= "id" ;
    public static final String NOTEPAD_CONTENT = "content";
    public static final String NOTEPAD_TIME = "notetime";
    //获取当前日期
    public static final String getTime (){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
        Date date = new Date(System.currentTimeMillis());
        return simpleDateFormat. format (date) ;
    }
}

SQLiteHelper类:

package cn.itcast.notepad.database;


import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

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

import cn.itcast.notepad.bean.NotepadBean;
import cn.itcast.notepad.utils.DBUtils;

public class SQLiteHelper extends SQLiteOpenHelper {
    private SQLiteDatabase sqLiteDatabase;

    public SQLiteHelper(Context context) {
        super(context, DBUtils.DATABASE_NAME ,null, DBUtils.DATABASE_VERION);
        sqLiteDatabase = this.getWritableDatabase();
    }



    @Override
    //创建表,列名分别为id、content、notetime,对应每列数据的id、记录的内容、保存记录的时间
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("Create table " + DBUtils.DATABASE_TABLE + "(" + DBUtils.NOTEPAD_ID +
                " integer primary key autoincrement,"
                + DBUtils.NOTEPAD_CONTENT + " text," + DBUtils.NOTEPAD_TIME + " text)");
        //"Create Table Notepad (id integer primary key autoincrement, content text, time text)"
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}

    //添加数据
    public boolean insertData(String userContent, String userTime){
        ContentValues contentValues = new ContentValues();
        contentValues.put(DBUtils.NOTEPAD_CONTENT, userContent);
        contentValues.put(DBUtils.NOTEPAD_TIME, userTime);
        return sqLiteDatabase.insert(DBUtils.DATABASE_TABLE, null, contentValues)>0;
    }

    //删除数据,根据传递的id删除数据库中对应的数据
    public boolean deleteData(String id){
        String sql = DBUtils.NOTEPAD_ID + "=?";
        String[] contentValuesArray = new String[]{String.valueOf(id)};
        return sqLiteDatabase.delete(DBUtils.DATABASE_TABLE, sql, contentValuesArray) > 0;
    }

    //修改数据
    public boolean updateData(String id, String content, String userYear){
        ContentValues contentValues = new ContentValues();
        contentValues.put(DBUtils.NOTEPAD_CONTENT, content);
        contentValues.put(DBUtils.NOTEPAD_TIME, userYear);
        String sql = DBUtils.NOTEPAD_ID + "=?";
        String[] strings = new String[]{id};
        return sqLiteDatabase.update(DBUtils.DATABASE_TABLE, contentValues, sql, strings) > 0;
    }

    //查询数据,通过while()循环遍历Cursor对象中的数据,并将遍历的数据存放在一个List<NotepadBean>类型的集合中。
    public List<NotepadBean> query(){
        List<NotepadBean> list = new ArrayList<NotepadBean>();
        Cursor cursor = sqLiteDatabase.query(DBUtils.DATABASE_TABLE, null, null, null, null, null, DBUtils.NOTEPAD_ID + " desc");
        if(cursor != null){
            while(cursor.moveToNext()){
                NotepadBean noteInfo = new NotepadBean();
                String id = String.valueOf(cursor.getInt(cursor.getColumnIndex(DBUtils.NOTEPAD_ID)));
                String content = cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_CONTENT));
                String time = cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_TIME));
                noteInfo.setId(id);
                noteInfo.setNotepadContent(content);
                noteInfo.setNotepadTime(time);
                list.add(noteInfo);
            }
            cursor.close();
        }
        return list;
    }

    public NotepadBean queryById(String id){
        NotepadBean noteInfo = new NotepadBean();
        Cursor cursor = sqLiteDatabase.query(DBUtils.DATABASE_TABLE, null, "id=?", new String[]{id}, null, null, DBUtils.NOTEPAD_ID + " desc");
        if(cursor != null){
            while(cursor.moveToNext()){
                //String id = String.valueOf(cursor.getInt(cursor.getColumnIndex(DBUtils.NOTEPAD_ID)));
                String content = cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_CONTENT));
                String time = cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_TIME));
                noteInfo.setId(id);
                noteInfo.setNotepadContent(content);
                noteInfo.setNotepadTime(time);
            }
            cursor.close();
        }
        return noteInfo;
    }

}

NotepadActivity类:

package cn.itcast.notepad;

import android.app.*;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;

import java.util.List;

import cn.itcast.notepad.adapter.NotepadAdapter;
import cn.itcast.notepad.bean.NotepadBean;
import cn.itcast.notepad.database.SQLiteHelper;

public class NotepadActivity extends Activity {
    ListView listView;
    List<NotepadBean> list;
    SQLiteHelper mSQLiteHelper;
    NotepadAdapter adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //用于显示记录的列表
        listView = (ListView) findViewById(R.id.listview);
        ImageView add = (ImageView) findViewById(R.id.add);

        //setOnClickListener()方法为添加按钮设置点击事件的监听器,通过startActivityForResult()方法跳转到添加记录界面
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(NotepadActivity.this,RecordActivity.class);
                startActivityForResult(intent,1);
            }
        });
        initData();
    }
    protected void initData(){
        mSQLiteHelper = new SQLiteHelper(this);//创建数据库
        showQueryData();

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
//            通过setOnItemClickListener()方法实现Item的点击事件,点击ltem,会调用onItemClick()方法,
//            在该方法中首先通过get()方法获取对应的Item数据,接着将这些数据通过putExtra()方法封装到Intent对象中,
//            最后调用startActivityForResult()方法跳转到修改记录界面。

            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                NotepadBean notepadBean = list.get(position);
                Intent intent = new Intent(NotepadActivity.this,RecordActivity.class);
                intent.putExtra("id",notepadBean.getId());
                intent.putExtra("time",notepadBean.getNotepadTime());
                intent.putExtra("content",notepadBean.getNotepadContent());
                NotepadActivity.this.startActivityForResult(intent,1);
            }
        });

        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
          //通过setOnItemLongClickListener()方法设置记事本界面列表中Item的长按事件的监听器,
            // 当长按Item时,程序会调用onItemLongClick()方法,在该方法中实现长按Item事件
            //实现删除记录

            public boolean onItemLongClick(AdapterView<?> parent, View view,final int position, long id) {
                AlertDialog dialog;
                AlertDialog.Builder builder = new AlertDialog.Builder(NotepadActivity.this).setMessage("是否删除此纪录?")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                NotepadBean notepadBean = list.get(position);
                                if (mSQLiteHelper.deleteData(notepadBean.getId())){
                                    list.remove(position);  //删除对应的Item
                                    adapter.notifyDataSetChanged(); //更新记事本界面
                                    Toast.makeText(NotepadActivity.this,"修改成功!",Toast.LENGTH_SHORT).show();
                                }
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();   //关闭对话框
                            }
                        });
                dialog = builder.create();  //创建对话框
                dialog.show();
                return true;
            }
        });
    }

    //创建一个showQueryData()方法查询数据库中存放的记录信息,并将该信息显示到记录列表中
    protected void showQueryData(){
        if (list != null){
            list.clear();
        }
        //从数据库中查询数据(保存的记录)
        list = mSQLiteHelper.query();
        adapter = new NotepadAdapter(this,list) ;
        listView.setAdapter(adapter);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1 && requestCode == 2){
            showQueryData();
        }
    }

}

NotepadAdapter类

package cn.itcast.notepad.adapter;
//创建一个数据适配器NotepadAdapter对ListView控件进行数据适配

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

import cn.itcast.notepad.R;
import cn.itcast.notepad.bean.NotepadBean;

public class NotepadAdapter extends BaseAdapter {
    private LayoutInflater layoutInflater;
    private List<NotepadBean> list;
    public NotepadAdapter(Context context, List<NotepadBean> list){
        this.layoutInflater = LayoutInflater.from(context);
        this.list = list;
    }
//    NotepadAdapter类继承自BaseAdapter类,并重写getCount()、getItem()、getltemld()、getView()方法,
//    这些方法分别用于获取Item总数、对应Item对象、Item对象的ld、对应的Item视图。

    @Override
    public int getCount() {

        return list == null ? 0 : list.size();
    }

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

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

    @Override
    //重写了getView()方法,该方法主要通过inflate()方法加载Item界面的布局文件,并将获取的数据显示到对应的控件上。
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        //判断了convertView 是否为null,如果为null,则创建一个ViewHolder对象,接
        // 着通过setTag()方法将该对象添加到convertView中进行缓存,否则,将通过getTag()方法获取缓存的ViewHolder对象。
        if (convertView == null){
            convertView = layoutInflater.inflate(R.layout.notepad_item_layout,null);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        NotepadBean noteInfo = (NotepadBean) getItem(position);
        viewHolder.tvNoteoadContent.setText(noteInfo.getNotepadContent());
        viewHolder.tvNotepadTime.setText(noteInfo.getNotepadTime());
        return convertView;
    }
    class ViewHolder{
        TextView tvNoteoadContent;
        TextView tvNotepadTime;
        public ViewHolder(View view){
            tvNoteoadContent = (TextView) view.findViewById(R.id.item_content);
            tvNotepadTime = (TextView)view.findViewById(R.id.item_time);
        }
    }

}

NotepadBean类

package cn.itcast.notepad.bean;
//创建一个NotepadBean类用于存放记事本中的每个记录的记录内容和保存记录的时间属性

public class NotepadBean {
    private String id;//记录的id
    private String notepadContent; //记录的内容
    private String notepadTime; //保存记录的时间
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
        public String getNotepadContent() {
            return notepadContent;
        }
        public void setNotepadContent (String notepadContent){
                    this.notepadContent = notepadContent;
                }
                public String getNotepadTime(){
        return notepadTime;
                }

                public void setNotepadTime (String notepadTime){
                    this.notepadTime = notepadTime;
                }
            }

RecordActivity类:

package cn.itcast.notepad;

import androidx.appcompat.app.AppCompatActivity;
import android.app.*;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import cn.itcast.notepad.database.SQLiteHelper;
import cn.itcast.notepad.utils.DBUtils;

public class RecordActivity extends Activity implements View.OnClickListener{
    ImageView note_back;
    TextView note_time;
    EditText content;
    ImageView delete;
    ImageView note_save;
    SQLiteHelper mSQLiteHelper;
    TextView noteName;
    String id;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_record);
        note_back = (ImageView) findViewById(R.id.note_back);
        note_time = (TextView) findViewById(R.id.tv_time);
        content = (EditText) findViewById(R.id.note_content);
        delete =  findViewById(R.id.delete);
        note_save = findViewById(R.id.note_save);
        noteName = findViewById(R.id.note_name);
        note_back.setOnClickListener(this);
        delete.setOnClickListener(this);
        note_save.setOnClickListener(this);
        initData();
    }

    protected void initData(){
        mSQLiteHelper = new SQLiteHelper(this);
        noteName.setText("添加记录");

        Intent intent = getIntent();
        if (intent != null){
            id = intent.getStringExtra("id");
            if (id != null){
                noteName.setText("修改记录");
                content.setText(intent.getStringExtra("content"));
                note_time.setText(intent.getStringExtra("time"));
                note_time.setVisibility(View.VISIBLE);
            }
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.note_back:    //后退键的点击事件
                finish();
                break;
            case R.id.delete:       //“清空”按钮的点击事件
                content.setText("");
                break;
            case R.id.note_save:    //"保存"按钮的点击事件
                //获取输入内容
                String noteContene = content.getText().toString().trim();
                //向数据库中添加数据
                if (id != null) {
                    if (noteContene.length() > 0) {
                        if (mSQLiteHelper.updateData(id,noteContene, DBUtils.getTime())) {
                            showToast("修改成功");
                            setResult(2);
                            finish();
                        } else {
                            showToast("修改失败");
                        }
                    } else {
                        showToast("修改内容不能为空");
                    }
                }else {//添加记录界面的保存操作
                    //向数据库中添加数据
                    if (noteContene.length() > 0){
                        if (mSQLiteHelper.insertData(noteContene,DBUtils.getTime())){
                            showToast("保存成功");
                            setResult(2);
                            finish();
                        }else {
                            showToast("保存失败");
                        }
                    }else {
                        showToast("修改内容不能为空");
                    }
                }
                break;
        }

    }

    public void showToast(String message){
        Toast.makeText(RecordActivity.this,message,Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onPointerCaptureChanged(boolean hasCapture) {

    }

}

activity_record.xml:

<?xml version="1.0" encoding="utf-8"?>
<!--    放置2个TextView控件,分别用于显示界面标题和记录时间,
1个EditText控件用于显示输入框,
3个ImageView控件分别用于显示后退键图标、删除按钮图标以及保存按钮图标-->

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#fefefe">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:background="#FFB6C1"
        android:orientation="horizontal">
        <ImageView
            android:layout_width="45dp"
            android:layout_height="wrap_content"
            android:id="@+id/note_back"
            android:layout_centerVertical="true"
            android:paddingLeft="11dp"
            android:src="@drawable/back"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/note_name"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:text="记事本"
            android:textColor="@android:color/white"
            android:textSize="15sp"
            android:textStyle="bold"/>
    </RelativeLayout>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv_time"
        android:textSize="15sp"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:gravity="center"
        android:visibility="gone"
        android:textColor="#FFB6C1"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/note_content"
        android:layout_weight="1"
        android:gravity="top"
        android:hint="请输入要添加的内容"
        android:paddingLeft="5dp"
        android:textColor="@android:color/black"
        android:background="#fefefe"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#FFB6C1"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:orientation="horizontal">
        <ImageView
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:id="@+id/delete"
            android:src="@drawable/delete"
            android:paddingBottom="15dp"
            android:paddingTop="9dp"/>
        <ImageView
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:id="@+id/note_save"
            android:src="@drawable/save_note"
            android:paddingBottom="15dp"
            android:paddingTop="9dp"/>
    </LinearLayout>
</LinearLayout>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值