From b633dd001880f76395d7aecd9922844b9e9c3e9c Mon Sep 17 00:00:00 2001 From: TRLVMMR <735029684@qq.com> Date: Sun, 14 Apr 2019 19:35:13 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=B8=BB=E9=A1=B5=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=8A=B6=E6=80=81,=20=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=A1=B5=E5=8A=A0=E5=85=A5=E7=BC=96=E8=BE=91=E4=B8=8E=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../edu/hzuapps/androidlabs/dao/TaskDao.java | 18 ++ .../androidlabs/listview/HomeListAdapter.java | 59 ++++-- .../androidlabs/presenter/JsonService.java | 2 - .../androidlabs/presenter/TaskService.java | 181 ++++++++++++++++-- .../soft1714080902223/DetailActivity.java | 34 +++- .../soft1714080902223/EditActivity.java | 33 +++- .../soft1714080902223/HomeActivity.java | 16 +- .../src/main/res/layout/activity_detail.xml | 32 +++- .../app/src/main/res/layout/activity_home.xml | 28 ++- .../app/src/main/res/layout/list_item.xml | 32 +++- .../app/src/main/res/values/colors.xml | 3 + 11 files changed, 353 insertions(+), 85 deletions(-) diff --git a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/dao/TaskDao.java b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/dao/TaskDao.java index f608b2de0..ec5aa13ac 100644 --- a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/dao/TaskDao.java +++ b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/dao/TaskDao.java @@ -53,6 +53,21 @@ public void update(String title, String content, long id){ ContentValues values = new ContentValues(); values.put("title", title); values.put("content", content); + values.put("finish", 0); + database.update(tableName, values, "id=?", + new String[]{Long.toString(id)}); + database.close(); + } + + public void update(String title, String content, int finish, long id){ + SQLiteDatabase database = taskDatabaseHelper.getWritableDatabase(); + ContentValues values = new ContentValues(); + if(title != null) + values.put("title", title); + if(content != null) + values.put("content", content); + values.put("finish", 0); + if(finish != 0) values.put("finish", 1); database.update(tableName, values, "id=?", new String[]{Long.toString(id)}); database.close(); @@ -94,8 +109,11 @@ public Task findById(long id){ public List findAll(){ List taskList = new ArrayList(); + System.out.println("11111111111111111111111"); SQLiteDatabase database = taskDatabaseHelper.getReadableDatabase(); + System.out.println("----------------------------"); Cursor cursor = database.query(tableName, null, null, null, null, null, "id desc"); + System.out.println("+++++++++++++++++++++++"); while(cursor.moveToNext()){ Task task = new Task(); task.setId(cursor.getLong(cursor.getColumnIndex("id"))); diff --git a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/listview/HomeListAdapter.java b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/listview/HomeListAdapter.java index fc76e6c82..88138865f 100644 --- a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/listview/HomeListAdapter.java +++ b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/listview/HomeListAdapter.java @@ -1,6 +1,7 @@ package edu.hzuapps.androidlabs.listview; import android.content.Context; + import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -10,30 +11,24 @@ import java.util.List; import edu.hzuapps.androidlabs.model.Task; +import edu.hzuapps.androidlabs.presenter.TaskService; import edu.hzuapps.androidlabs.soft1714080902223.R; public class HomeListAdapter extends BaseAdapter { - private Context mContext; private LayoutInflater mLayoutInflater; + //由于引用传递,又由于TaskService是单例,tasks赋值一次后便作为TaskService中list的的观察者 private List tasks; - - public HomeListAdapter(Context context, List tasks){ - mContext = context; - mLayoutInflater = LayoutInflater.from(context); - this.tasks = tasks; - } + private TaskService taskService; public HomeListAdapter(Context context){ mContext = context; mLayoutInflater = LayoutInflater.from(context); + taskService = TaskService.INSTANCE.getTaskService(mContext, this); + tasks = taskService.getAllList(); } - public void setTasks(List tasks){ - if(tasks == null) { - return; - } - this.tasks = tasks; + public void notifyChange(){ // 通知ListView修改了 notifyDataSetChanged(); } @@ -52,6 +47,7 @@ public int getCount() { * @param position 参数为第几个对象 * @return 返回子项对应的对象 */ + @Override public Object getItem(int position) { //获取列表中的对象 @@ -61,15 +57,15 @@ public Object getItem(int position) { /** * * @param position - * @return 返回子项的是第几个 + * @return 返回对应位置的item的id */ @Override public long getItemId(int position) { - return position; + return 0; } static class ViewHolder { - TextView lvTitle, lvTime, lvContent; + TextView lvTitle, lvTime, lvContent, lvStatus; } /** @@ -80,10 +76,10 @@ static class ViewHolder { * @return 返回子项视图 */ @Override - public View getView(int position, View convertView, ViewGroup parent) { + public View getView(final int position, View convertView, ViewGroup parent) { Task task = (Task) getItem(position); View view; - ViewHolder holder; + final ViewHolder holder; //如果不存在,就去xml中获取,存在就直接用 if(convertView == null){ //关联list_item及其参数 @@ -92,16 +88,41 @@ public View getView(int position, View convertView, ViewGroup parent) { holder.lvTitle = view.findViewById(R.id.lv_title); holder.lvContent = view.findViewById(R.id.lv_content); holder.lvTime = view.findViewById(R.id.lv_time); + holder.lvStatus = view.findViewById(R.id.lv_status); view.setTag(holder); } else{ view = convertView; holder = (ViewHolder) convertView.getTag(); } - //使用blog中的数据填上 + //使用task中的数据填上 holder.lvTitle.setText(task.getTitle()); holder.lvContent.setText(task.getContent()); - holder.lvTime.setText(task.getDate()); + holder.lvTime.setText(taskService.getTextTime(task.getDate())); + + //根据Finish的值的不同更改样式 + if(task.getFinish() == 0){ + taskService.setStatus(holder.lvStatus, taskService.UNFINALSTATUS, position); + }else{ + taskService.setStatus(holder.lvStatus, taskService.FINALSTATUS, position); + } + + //设置点击更换标签样式 + holder.lvStatus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(holder.lvStatus.getText() == taskService.FINALSTATUS){ + taskService.setStatus(holder.lvStatus, taskService.UNFINALSTATUS, position); + }else{ + taskService.setStatus(holder.lvStatus, taskService.FINALSTATUS, position); + } + + } + }); return view; } + + + + } diff --git a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/presenter/JsonService.java b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/presenter/JsonService.java index 82776d7e9..1c5f04f69 100644 --- a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/presenter/JsonService.java +++ b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/presenter/JsonService.java @@ -1,6 +1,5 @@ package edu.hzuapps.androidlabs.presenter; -import org.json.JSONArray; import org.json.JSONObject; import java.io.BufferedReader; @@ -9,7 +8,6 @@ import java.net.HttpURLConnection; import java.net.URL; -import edu.hzuapps.androidlabs.soft1714080902223.R; public class JsonService { diff --git a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/presenter/TaskService.java b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/presenter/TaskService.java index 1b3188021..11598a66a 100644 --- a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/presenter/TaskService.java +++ b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/presenter/TaskService.java @@ -2,25 +2,57 @@ import android.content.Context; import android.util.ArrayMap; +import android.widget.TextView; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Map; import edu.hzuapps.androidlabs.dao.TaskDao; import edu.hzuapps.androidlabs.listview.HomeListAdapter; import edu.hzuapps.androidlabs.model.Task; +import edu.hzuapps.androidlabs.soft1714080902223.R; + + +public enum TaskService { + + //使用单例模式实现,保证线程安全 + INSTANCE; + private TaskService instance; + + public final String FINALSTATUS = "完成"; + public final String UNFINALSTATUS = "进行中"; -public class TaskService { private TaskDao taskDao; - private Context context; - private List taskList = null; + //单例保证taskList的使用,而不用每次都去数据库,节约开销 + private List taskList; private HomeListAdapter homeListAdapter; - public TaskService(Context context){ - //为每一个activity创建一个dao - taskDao = new TaskDao(context); - this.context = context; - homeListAdapter = new HomeListAdapter(context); + private TaskService(){ + taskList = new ArrayList<>(); + } + /** + * TaskService的初始化函数,需要上下文时进行修改 + * @param context + * @return + */ + public TaskService getTaskService(Context context){ + INSTANCE.taskDao = new TaskDao(context); + return INSTANCE; + } + + /** + * TaskService的初始化函数,需要上下文跟设配器时进行修改 + * @param context + * @param homeListAdapter + * @return + */ + public TaskService getTaskService(Context context, HomeListAdapter homeListAdapter){ + INSTANCE.taskDao = new TaskDao(context); + INSTANCE.homeListAdapter = homeListAdapter; + return INSTANCE; } /** @@ -35,8 +67,44 @@ public long saveTask(String title, String content){ } /** - * - * @param id + * 用于设置完成状态标签的值, 并更新数据库的值 + * @param view 具体某个TextView的 + * @param status status值 + */ + public void setStatus(TextView view, String status, int position){ + view.setText(status); + switch (status){ + case FINALSTATUS: + view.setBackgroundResource(R.color.colorFinalStatus); + INSTANCE.changeTaskStatus(1, position); + break; + case UNFINALSTATUS: + view.setBackgroundResource(R.color.colorUnFinalStatus); + INSTANCE.changeTaskStatus(0, position); + break; + } + } + + /** + * 修改Task的状态值,并在通知其他地方更新 + * @param finish + * @param position + */ + public void changeTaskStatus(int finish, int position){ + Task task = taskList.get(position); + if(task.getFinish() != finish) { + task.setFinish(finish); + Task task1 = taskList.set(position, task); + task = taskList.get(position); + taskDao.update(null, null, finish, task.getId()); + homeListAdapter.notifyChange(); + } + } + + + /** + * 将数据库的数据加入列表中 + * @param id 数据id */ private void add(long id){ @@ -47,11 +115,16 @@ private void add(long id){ Task task = taskDao.findById(id); taskList.add(0, task); } - homeListAdapter.setTasks(taskList); + homeListAdapter.notifyChange(); } - public Map get(long id){ - Task task = taskDao.findById(id); + /** + * 获取对应位置的Task + * @param position + * @return + */ + public Map get(int position){ + Task task = taskList.get(position); Map map = new ArrayMap<>(); map.put("title", task.getTitle()); map.put("content", task.getContent()); @@ -66,12 +139,84 @@ public Map get(long id){ * 把包含所有Task的Adapter返回 * @return 返回结果的设配器 */ - public HomeListAdapter allListAdapter(){ - if(taskList == null){ - taskList = taskDao.findAll(); + public List getAllList(){ + if(INSTANCE.taskList == null){ + } + else if(INSTANCE.taskList.isEmpty()){ + INSTANCE.taskList = taskDao.findAll(); + } + else + System.out.println(taskList.size()); + return INSTANCE.taskList; + } + + /** + * 获取可以显示的时间,如刚刚,几分钟前 + * @param time 输入"yyyy-MM-dd HH:mm:ss"格式的字符串 + * @return + */ + public String getTextTime(String time){ + SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd:HH:mm"); + Date now = new Date(); + Date old = null; + try { + old = simpleDateFormat1.parse(time); + }catch (Exception e){ + e.printStackTrace(); + } + String[] olds = simpleDateFormat.format(old).split(":"); + String[] nows = simpleDateFormat.format(now).split(":"); + + String result = time; + if(olds[0].equals(nows[0])) + { + result = String.format("%s:%s", olds[1], olds[2]); + if(olds[1].equals(nows[1])){ + long until = Long.parseLong(nows[2]) - Long.parseLong(olds[2]); + if(until < 5){ + result = "刚刚"; + } + else { + result = until + "分钟前"; + } + } + } + return result; + } + + /** + * 更新某个Task + * @param position task的位置 + * @param title + * @param context + * @return + */ + + public TaskService update(int position, String title,String context){ + if(position <= taskList.size() && position >= 0){ + Task task = taskList.get(position); + task.setContent(context); + task.setTitle(title); + taskList.set(position, task); + taskDao.update(title, context, task.getId()); + } + homeListAdapter.notifyChange(); + return INSTANCE; + } + + /** + * 删除某个task + * @param position task的位置 + * @return + */ + public TaskService delete(int position){ + if(position <= taskList.size() && position >= 0){ + Task task = taskList.remove(position); + taskDao.delete(task.getId()); } - homeListAdapter.setTasks(taskList); - return homeListAdapter; + //删除没加nofity也没问题,猜测是ListView有检测 + return INSTANCE; } } diff --git a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902223/DetailActivity.java b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902223/DetailActivity.java index a5badc313..165b5f8aa 100644 --- a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902223/DetailActivity.java +++ b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902223/DetailActivity.java @@ -4,11 +4,13 @@ import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; +import android.widget.Button; import android.widget.ImageButton; import android.widget.TextView; import java.util.Map; +import edu.hzuapps.androidlabs.listview.HomeListAdapter; import edu.hzuapps.androidlabs.presenter.TaskService; public class DetailActivity extends AppCompatActivity { @@ -16,6 +18,9 @@ public class DetailActivity extends AppCompatActivity { ImageButton imageButton; TextView tv_title; TextView tv_content; + Button btn_edit; + Button btn_delete; + int position; @Override protected void onCreate(Bundle savedInstanceState) { @@ -29,19 +34,38 @@ public void onClick(View v) { startActivity(intent); } }); - + btn_delete = findViewById(R.id.btn_delete); + btn_edit = findViewById(R.id.btn_edit); + //跳转到编辑页面的监听器 + btn_edit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(DetailActivity.this, EditActivity.class); + intent.putExtra("position", position); + startActivity(intent); + } + }); + //删除后跳转到主页 + btn_delete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(DetailActivity.this, HomeActivity.class); + TaskService.INSTANCE.delete(position); + startActivity(intent); + } + }); } @Override protected void onStart() { super.onStart(); - //获取传递过来的id的值 + //获取传递过来的position的值 Intent intent = getIntent(); - long id = intent.getLongExtra("id", -1); + position = intent.getIntExtra("position", -1); tv_title = findViewById(R.id.detail_title); tv_content = findViewById(R.id.detail_body); - TaskService taskService = new TaskService(this); - Map map = taskService.get(id); + TaskService taskService = TaskService.INSTANCE.getTaskService(this); + Map map = taskService.get(position); tv_title.setText(map.get("title")); tv_content.setText(map.get("content")); diff --git a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902223/EditActivity.java b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902223/EditActivity.java index b82cdcf4c..7033f9408 100644 --- a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902223/EditActivity.java +++ b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902223/EditActivity.java @@ -9,6 +9,8 @@ import android.widget.EditText; import android.widget.Toast; +import java.util.Map; + import edu.hzuapps.androidlabs.presenter.TaskService; public class EditActivity extends AppCompatActivity { @@ -16,6 +18,8 @@ public class EditActivity extends AppCompatActivity { private Button mBtn; private EditText title; private EditText content; + int position; + @Override protected void onCreate(Bundle savedInstanceState) { @@ -49,16 +53,23 @@ else if(content.getText().length() == 0) { content.requestFocus(); } else{ - TaskService taskService = new TaskService(EditActivity.this); + TaskService taskService = TaskService.INSTANCE.getTaskService(EditActivity.this); String titleStr = title.getText().toString(); String contentStr = content.getText().toString(); - long id = taskService.saveTask(titleStr, contentStr); Toast.makeText(EditActivity.this, "提交成功", Toast.LENGTH_SHORT).show(); //跳转到详情页 Intent intent = new Intent(EditActivity.this, DetailActivity.class); + //如果是新建就创建,若是编辑就更新 + if(position == -1){ + taskService.saveTask(titleStr, contentStr); + position = 0; + } + else{ + taskService.update(position, titleStr, contentStr); + } //把id传递给DetailActivity - intent.putExtra("id", id); + intent.putExtra("position", position); startActivity(intent); } @@ -66,8 +77,22 @@ else if(content.getText().length() == 0) { }); - } + @Override + protected void onStart() { + super.onStart(); + Intent intent = getIntent(); + //如果没获取到,则意味着是新建数据 + position = intent.getIntExtra("position", -1); + if (position != -1) { + Map map = TaskService.INSTANCE.get(position); + title.setText(map.get("title")); + content.setText(map.get("content")); + + } + + + } } diff --git a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902223/HomeActivity.java b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902223/HomeActivity.java index a1ac3d6a7..1f7f94689 100644 --- a/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902223/HomeActivity.java +++ b/students/soft1714080902223/app/src/main/java/edu/hzuapps/androidlabs/soft1714080902223/HomeActivity.java @@ -8,21 +8,13 @@ import android.widget.ImageButton; import android.widget.ListView; import android.widget.TextView; -import android.widget.Toast; -import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; +import edu.hzuapps.androidlabs.listview.HomeListAdapter; import edu.hzuapps.androidlabs.model.Task; import edu.hzuapps.androidlabs.presenter.JsonService; -import edu.hzuapps.androidlabs.presenter.TaskService; public class HomeActivity extends AppCompatActivity { @@ -45,7 +37,7 @@ public void onClick(View v) { }); lv_1 = findViewById(R.id.home_list); - lv_1.setAdapter(new TaskService(this).allListAdapter()); + lv_1.setAdapter(new HomeListAdapter(this)); //为每个list_Item设置点击事件 lv_1.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override @@ -53,10 +45,10 @@ public void onItemClick(AdapterView parent, View view, int position, long id) Intent intent = new Intent(HomeActivity.this, DetailActivity.class); Task task = (Task)parent.getItemAtPosition(position); long taskId = task.getId(); + intent.putExtra("position", position); + System.out.println(position); intent.putExtra("id", taskId); - System.out.println(id); startActivity(intent); -// Toast.makeText(HomeActivity.this, "您单击了" + position, Toast.LENGTH_SHORT).show(); } }); diff --git a/students/soft1714080902223/app/src/main/res/layout/activity_detail.xml b/students/soft1714080902223/app/src/main/res/layout/activity_detail.xml index 59b5f009c..e3152d4ad 100644 --- a/students/soft1714080902223/app/src/main/res/layout/activity_detail.xml +++ b/students/soft1714080902223/app/src/main/res/layout/activity_detail.xml @@ -28,18 +28,44 @@ android:textSize="30sp" android:textStyle="bold" /> - + + +