学了一段时间的Android,准备写一个简单的记事本练练手,本程序使用了litepal+recyclerview+一点Material Design中的界面设计,但由于本人审美水平原因,可能设计得不是很好看。
implementation 'com.android.support:design:29.1.1'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'org.litepal.android:java:3.0.0'
用litepal建立数据库,具体步骤我就不多说了,可以参考我上一条博客,这里就直接上代码
litepal.xml
Tickler.java这里在com.example.tickler目录下新建一个db文件夹
package com.example.tickler.db;
import org.litepal.crud.LitePalSupport;
public class Tickler extends LitePalSupport {
private int id;
private String content;
private String time;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}
先看主页面得布局activity_main.xml
这里用了加强版的帧布局:CoordinatorLayout,它可以解决在底部弹出消息时覆盖住了悬浮按钮的问题,然后就是Toolbar代替系统自带标题栏,还有下面的recyclerview和悬浮按钮的设置,由于是加强的帧布局,所有的控件都会在左上角,会造成recyclerview遮住toolbar的问题,这里用AppBarLayout让recyclerview下移一个toolbar的高度。
MainActivity.java
package com.example.tickler;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.example.tickler.db.Tickler;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.litepal.LitePal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private List
main_toolbar.xml在res目录下新建一个文件夹menu
recyclerview的子项布局content_item.xml
recyclerview的适配器ContentAdapter.java
package com.example.tickler;
import android.content.Intent;
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.List;
import java.util.Map;
public class ContentAdapter extends RecyclerView.Adapter {
private List> mContentList;
static class ViewHolder extends RecyclerView.ViewHolder{
View ticklerView;
TextView contentText;
TextView showTime;
public ViewHolder(View view){
super(view);
ticklerView=view;
contentText=(TextView) view.findViewById(R.id.show_content);
showTime=(TextView) view.findViewById(R.id.show_time);
}
}
public ContentAdapter(List> contentList){
mContentList=contentList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.content_item,parent,false);
//设置子项点击事件,并传递数据到添加页
final ViewHolder holder=new ViewHolder(view);
holder.ticklerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position=holder.getAdapterPosition();
String content=mContentList.get(position).get("content");
String time=mContentList.get(position).get("time");
Intent intent=new Intent(parent.getContext(),AddContentActivity.class);
intent.putExtra(AddContentActivity.CONTENT,content);
intent.putExtra(AddContentActivity.TIME,time);
parent.getContext().startActivity(intent);
}
});
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.contentText.setText(mContentList.get(position).get("content"));
holder.showTime.setText(mContentList.get(position).get("time"));
}
@Override
public int getItemCount() {
return mContentList.size();
}
}
activity_add_content.xml
AddContentActivity.java
package com.example.tickler;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.example.tickler.db.Tickler;
import org.litepal.LitePal;
import java.text.SimpleDateFormat;
import java.util.Date;
public class AddContentActivity extends AppCompatActivity{
public static final String CONTENT="content";
public static final String TIME="time";
private String time;
private EditText content;
private TextView showTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_content);
content=(EditText) findViewById(R.id.add_content);
showTime=(TextView) findViewById(R.id.time_show);
Toolbar toolbar=(Toolbar) findViewById(R.id.toolbar_1);
setSupportActionBar(toolbar);
ActionBar actionBar=getSupportActionBar();
if(actionBar!=null){//显示系统返回按钮
actionBar.setDisplayHomeAsUpEnabled(true);
}
//取得内容和时间
Intent intent=getIntent();
time=intent.getStringExtra(TIME);
String showContent=intent.getStringExtra(CONTENT);
showTime.setText(time);
content.setText(showContent);
if(showContent!=null) {
content.setSelection(showContent.length());//将光标移动到文本最后
}
}
//配置菜单项设置点击事件
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.toolbar,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.save_content:
//判断当前操作是新增还是修改
if(time!=null){
String inputText=content.getText().toString();
Tickler tickler=new Tickler();
tickler.setContent(inputText);
tickler.updateAll("time=?",time);
finish();
break;
}else {
//取得新增记录时的系统时间
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date=new Date(System.currentTimeMillis());
String inputText=content.getText().toString();
Tickler tickler=new Tickler();
tickler.setContent(inputText);
tickler.setTime(simpleDateFormat.format(date));
tickler.save();
Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show();
finish();//操作完成结束当前活动
break;}
case R.id.delete:
//删除操作
String deleteContent=content.getText().toString();
LitePal.deleteAll(Tickler.class,"content=?",deleteContent);
finish();
break;
case android.R.id.home://一定添加android还有下面这行代码,我当时为这搞了半天
onBackPressed();
return true;
default:
}
return true;
}
}
菜单布局toolbar.xml
主要的代码就是这些,附上源码:
链接:https://pan.baidu.com/s/1XszlojQGSLsn2pPM_XaoJA
提取码:g3zw