记事本app(Android基础开发实例)
项目地址
https://gitee.com/heziyan_code/note-book
项目结构
- Room数据库:AppDatabase/User/UserDao
- Main界面:将List中的内容显示出来
- Edit界面:编辑内容
Room数据库
关于Room的基本用法请看官网介绍:https://developer.android.google.cn/training/data-storage/room
定义id主键与content内容
@Entity
public class User {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo
public String content;
}
创造增删改查方法
@Dao
public interface UserDao {
@Insert
public void addContent(User user);
@Query("SELECT * FROM user")
public List showThis();
@Delete
public void delete(User user);
@Query("UPDATE user SET content = :content WHERE id = :id")
public int updateUser(String content,int id);
@Update
public void updateUser(User... users);
}
创建主视图
创造布局界面
显示效果
在Activity中为按钮和item添加事件与数据
public class MainActivity extends Activity {
private Button btn_editnote;
private RecyclerView mrmain;
private AppDatabase db;
private UserDao dao;
private SharedPreferences spf;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_editnote = findViewById(R.id.btn_editnote);
btn_editnote.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,EditView.class);
Bundle bundle = new Bundle();
bundle.putInt("num",-1);
intent.putExtras(bundle);
startActivity(intent);
}
});
//数据库连接
db = Room.databaseBuilder(this,AppDatabase.class,"test").allowMainThreadQueries().build();
dao = db.userDao();
List users = dao.showThis();
// spf = getSharedPreferences("data",MODE_PRIVATE);
// String name = spf.getString("name", "");
// int id_update = spf.getInt("id_update", 0);
// System.out.println(id_update+":"+name);
// User userabc = new User();
// userabc.id = id_update;
// userabc.content = name;
// int i = dao.updateUser(name,id_update);
// System.out.println("更新了"+i+"条数据");
mrmain = findViewById(R.id.listview);
mrmain.setLayoutManager(new LinearLayoutManager(MainActivity.this));
mrmain.addItemDecoration(new MyDecortion());
mrmain.setAdapter(new CustomAdapter(users, MainActivity.this, new CustomAdapter.OnItemClickListener() {
@Override
public void onClick(int pos,User user) {
Intent intent = new Intent(MainActivity.this,EditView.class);
Bundle bundle = new Bundle();
bundle.putInt("id",pos);
bundle.putString("content",users.get(pos).content);
intent.putExtras(bundle);
//修改时先删除该数据
dao.delete(user);
startActivity(intent);
}
@Override
public void onLongClick(int pos, User user) {
Toast.makeText(MainActivity.this,"这是第"+pos,Toast.LENGTH_SHORT).show();
//对话框确认删除
onCreateDialog(user).show();
}
}));
}
@Override
protected void onResume() {
super.onResume();
onCreate(null);
}
public Dialog onCreateDialog(User user) {
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage("确认删除?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// FIRE ZE MISSILES!
dao.delete(user);
onCreate(null);//刷新界面
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
// Create the AlertDialog object and return it
return builder.create();
}
class MyDecortion extends RecyclerView.ItemDecoration{
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.set(0,0,0,1);
}
}
}
与RecycleView相关的Adapter
Adapter详解
public class CustomAdapter extends RecyclerView.Adapter {
private List users;
private Context context;
private OnItemClickListener listener;
public CustomAdapter(List users,Context context,OnItemClickListener listener) {
this.users = users;
this.context = context;
this.listener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Date date = new Date();
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
holder.textView.setText(users.get(position).content);
holder.tv_1.setText(ft.format(date));
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
listener.onLongClick(position,users.get(position));
return false;
}
});
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick(position,users.get(position));
}
});
}
@Override
public int getItemCount() {
return users.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView textView,tv_1;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv_content);
tv_1 = itemView.findViewById(R.id.tv_date);
}
}
public interface OnItemClickListener{
void onClick(int pos,User user);
void onLongClick(int pos,User user);
}
}
Edit界面
功能:点击按钮挑传到空白界面,点击item跳转到修改界面
编辑界面展示
<?xml version="1.0" encoding="utf-8"?>
EditActivity逻辑跳转
public class EditView extends AppCompatActivity {
public AppDatabase db;
private EditText et_content;
private Button btn_cancel,btn_ok;
private Bundle bundle;
private SharedPreferences spf;
private SharedPreferences.Editor editor;
private int i = 0;
private User user = new User();
private UserDao dao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_view);
et_content = findViewById(R.id.et_content);
btn_ok = findViewById(R.id.btn_ok);
btn_cancel = findViewById(R.id.btn_cancel);
db = Room.databaseBuilder(this,AppDatabase.class,"test").allowMainThreadQueries().build();
dao = db.userDao();
bundle = getIntent().getExtras();
int num = bundle.getInt("num");
int idnum = bundle.getInt("id");
String content = bundle.getString("content");
User user_yuanlai = new User();
user_yuanlai.id = idnum;
user_yuanlai.content = content;
if(num<0) {
i = 1;
btn_ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
User user = new User();
Date dNow = new Date();
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String s = et_content.getText().toString();
user.content = s;
// user.date = ft.format(dNow);
dao.addContent(user);
Toast.makeText(getApplicationContext(), "保存成功", Toast.LENGTH_SHORT).show();
onBackPressed();
}
});
}else{
dao.delete(user_yuanlai);
System.out.println(idnum+":"+content);
et_content.setText(content);
user.content = content;
btn_ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int id = bundle.getInt("idnum");
String s = et_content.getText().toString();
spf = getSharedPreferences("data",MODE_PRIVATE);
editor = spf.edit();
user.content = s;
editor.putString("name",s);
editor.putInt("id_update",idnum);
editor.apply();
dao.updateUser(user);
//更新无效
dao.addContent(user);
i = 1;
Toast.makeText(getApplicationContext(), "修改成功", Toast.LENGTH_SHORT).show();
onBackPressed();
}
});
}
btn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(EditView.this,MainActivity.class);
startActivity(intent);
onBackPressed();
}
});
}
@Override
protected void onPause() {
super.onPause();
if(i==0)
dao.addContent(user);
}
}