From 25cf379393487b829118189113a558a88a2ade3a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8B=87=E6=95=A2di=E7=89=9B=E7=89=9B?=
<1018389619.@qq.com>
Date: Wed, 18 May 2022 19:03:25 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=B6=E5=AE=9A=E5=8D=95=E8=AF=8D=E8=AE=A1?=
=?UTF-8?q?=E5=88=92=E5=8A=9F=E8=83=BD=E7=9A=84=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/misc.xml | 1 +
app/src/main/AndroidManifest.xml | 5 +-
app/src/main/assets/litepal.xml | 1 +
.../testapp/Adapter/MeanChoiceAdapter.java | 126 ++++++++++
.../example/testapp/LearnWordActivity.java | 235 +++++++++++++++---
.../com/example/testapp/MainActivity.java | 24 +-
.../com/example/testapp/SetPlanActivity.java | 149 +++++++++++
.../com/example/testapp/Util/TimeHelper.java | 106 ++++++++
.../com/example/testapp/Util/WordPlan.java | 107 ++++++++
.../{TestActivity.java => WordActivity.java} | 17 +-
.../com/example/testapp/bean/BookData.java | 1 +
.../example/testapp/database/UserData.java | 49 ++++
.../com/example/testapp/database/Word.java | 12 +-
.../testapp/listener/CallBackListener.java | 14 ++
.../testapp/listener/OnItemClickListener.java | 14 ++
.../testapp/listener/PermissionListener.java | 14 ++
.../example/testapp/ui/home/HomeFragment.java | 10 +
app/src/main/res/layout/activity_set_plan.xml | 116 +++++++++
app/src/main/res/layout/activity_test.xml | 2 +-
app/src/main/res/layout/fragment_home.xml | 2 +-
app/src/main/res/values/strings.xml | 4 +
21 files changed, 958 insertions(+), 51 deletions(-)
create mode 100644 app/src/main/java/com/example/testapp/Adapter/MeanChoiceAdapter.java
create mode 100644 app/src/main/java/com/example/testapp/SetPlanActivity.java
create mode 100644 app/src/main/java/com/example/testapp/Util/TimeHelper.java
create mode 100644 app/src/main/java/com/example/testapp/Util/WordPlan.java
rename app/src/main/java/com/example/testapp/{TestActivity.java => WordActivity.java} (90%)
create mode 100644 app/src/main/java/com/example/testapp/database/UserData.java
create mode 100644 app/src/main/java/com/example/testapp/listener/CallBackListener.java
create mode 100644 app/src/main/java/com/example/testapp/listener/OnItemClickListener.java
create mode 100644 app/src/main/java/com/example/testapp/listener/PermissionListener.java
create mode 100644 app/src/main/res/layout/activity_set_plan.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 1caa6c1..d108752 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -34,6 +34,7 @@
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 671cd6e..2ca9224 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -17,7 +17,10 @@
android:theme="@style/Theme.TestApp"
android:usesCleartextTraffic="true">
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/Adapter/MeanChoiceAdapter.java b/app/src/main/java/com/example/testapp/Adapter/MeanChoiceAdapter.java
new file mode 100644
index 0000000..02f29c8
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/Adapter/MeanChoiceAdapter.java
@@ -0,0 +1,126 @@
+package com.example.testapp.Adapter;
+
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.cardview.widget.CardView;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bumptech.glide.Glide;
+import com.example.testapp.R;
+import com.example.testapp.listener.OnItemClickListener;
+import com.example.testapp.Util.MyApplication;
+import com.example.testapp.entity.ItemWordMeanChoice;
+
+
+import java.util.List;
+
+public class MeanChoiceAdapter extends RecyclerView.Adapter implements View.OnClickListener {
+
+ // 判断是否是第一次点击
+ public static boolean isFirstClick = true;
+
+ private RecyclerView recyclerView;
+
+ private List mItemWordMeanChoiceList;
+
+ private static final String TAG = "MeanChoiceAdapter";
+
+ // 声明单击接口
+ private OnItemClickListener onItemClickListener;
+
+ public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
+ this.onItemClickListener = onItemClickListener;
+ }
+
+ // 将RecyclerView附加到Adapter上
+
+
+ @Override
+ public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
+ super.onAttachedToRecyclerView(recyclerView);
+ this.recyclerView = recyclerView;
+ }
+
+ @Override
+ public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
+ super.onDetachedFromRecyclerView(recyclerView);
+ this.recyclerView = null;
+ }
+
+ @Override
+ public void onClick(View v) {
+ int position = recyclerView.getChildAdapterPosition(v);
+ Log.i(TAG, "onClick: 第几个选项被点击了?"+position);
+ if (onItemClickListener != null) {
+ Log.i(TAG, "onClick: 没有onItemClickListener");
+ onItemClickListener.onItemClick(recyclerView, v, position, mItemWordMeanChoiceList.get(position));
+ }
+ }
+
+ static class ViewHolder extends RecyclerView.ViewHolder {
+
+ View meanView;
+ CardView cardMean;
+ ImageView imgChoice;
+ TextView textWordMean;
+
+ public ViewHolder(View itemView) {
+ super(itemView);
+ meanView = itemView;
+ cardMean = itemView.findViewById(R.id.item_card_word_choice);
+ imgChoice = itemView.findViewById(R.id.item_img_word_choice_status);
+ textWordMean = itemView.findViewById(R.id.item_text_word_means);
+ }
+
+ }
+
+ public MeanChoiceAdapter(List mItemWordMeanChoiceList) {
+ this.mItemWordMeanChoiceList = mItemWordMeanChoiceList;
+ }
+
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_word_mean_choice, parent, false);
+ view.setOnClickListener(this);
+ final ViewHolder holder = new ViewHolder(view);
+ return holder;
+ }
+
+ @Override
+ public void onBindViewHolder(ViewHolder holder, int position) {
+ ItemWordMeanChoice itemWordMeanChoice = mItemWordMeanChoiceList.get(position);
+ holder.textWordMean.setText(itemWordMeanChoice.getWordMean());
+ holder.imgChoice.setVisibility(View.VISIBLE);
+ holder.textWordMean.setTextColor(recyclerView.getContext().getResources().getColor(R.color.colorLightBlack));
+ if (itemWordMeanChoice.isRight() == ItemWordMeanChoice.WRONG) {
+ // 说明答错了
+ holder.cardMean.setCardBackgroundColor(recyclerView.getContext().getColor(R.color.colorLittleRed));
+ holder.imgChoice.setVisibility(View.VISIBLE);
+ Glide.with(recyclerView.getContext()).load(R.drawable.icon_wrong).into(holder.imgChoice);
+ holder.textWordMean.setTextColor(recyclerView.getContext().getColor(R.color.colorLightRed));
+ } else if (itemWordMeanChoice.isRight() == ItemWordMeanChoice.RIGHT) {
+ // 说明答对了
+
+ holder.cardMean.setCardBackgroundColor(recyclerView.getContext().getResources().getColor(R.color.colorLittleBlue));
+ holder.imgChoice.setVisibility(View.VISIBLE);
+ Glide.with(recyclerView.getContext()).load(R.drawable.btn_blue).into(holder.imgChoice);
+ holder.textWordMean.setTextColor(recyclerView.getContext().getResources().getColor(R.color.colorLightBlue));
+ } else if (itemWordMeanChoice.isRight() == ItemWordMeanChoice.NOTSTART) {
+ holder.cardMean.setCardBackgroundColor(recyclerView.getContext().getColor(R.color.colorBgWhite));
+ holder.imgChoice.setVisibility(View.GONE);
+ holder.textWordMean.setTextColor(recyclerView.getContext().getResources().getColor(R.color.colorLightBlack));
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return mItemWordMeanChoiceList.size();
+ }
+
+}
diff --git a/app/src/main/java/com/example/testapp/LearnWordActivity.java b/app/src/main/java/com/example/testapp/LearnWordActivity.java
index 91a894b..1e1063f 100644
--- a/app/src/main/java/com/example/testapp/LearnWordActivity.java
+++ b/app/src/main/java/com/example/testapp/LearnWordActivity.java
@@ -3,6 +3,7 @@ package com.example.testapp;
import android.app.ActivityOptions;
import android.content.Intent;
import android.os.Bundle;
+import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@@ -16,16 +17,19 @@ import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
+import com.example.testapp.Adapter.MeanChoiceAdapter;
import com.example.testapp.Util.MediaHelper;
import com.example.testapp.Util.TimeController;
+import com.example.testapp.Util.WordPlan;
import com.example.testapp.database.Interpretation;
import com.example.testapp.database.Sentence;
import com.example.testapp.database.Word;
import com.example.testapp.entity.ItemWordMeanChoice;
-
+import com.example.testapp.listener.OnItemClickListener;
import org.litepal.LitePal;
+import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -33,6 +37,7 @@ import java.util.List;
public class LearnWordActivity extends AppCompatActivity implements View.OnClickListener{
private int NowId;
+ private int Index;
private RecyclerView recyclerView;
@@ -63,6 +68,14 @@ public class LearnWordActivity extends AppCompatActivity implements View.OnClick
private TextView textLearnNum, textReviewNum;
+ public static final int MODE_LEARN = 1;
+ public static final int MODE_REVIEW = 2;
+ public static final int MODE_NO = 0;
+ private int learnMode = MODE_NO;
+
+
+ private MeanChoiceAdapter meanChoiceAdapter;
+
private static final String TAG = "LearnWordActivity";
public static boolean needUpdate = true;
@@ -79,32 +92,98 @@ public class LearnWordActivity extends AppCompatActivity implements View.OnClick
private String tipSentence;
+ public static List wordsIdNeed = new ArrayList<>();
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_learn_word);
+ init(); //寻找控件
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
+ recyclerView.setLayoutManager(linearLayoutManager);
+ meanChoiceAdapter = new MeanChoiceAdapter(wordMeanChoices);
+ recyclerView.setAdapter(meanChoiceAdapter);
+ judgeMode(); //判断学习模式
+ Log.i(TAG, "judgeMode:"+learnMode);
+ SetUi();
+ }
- init();
- //寻找控件
- NowId = 1;
- setWord();
-
-
+ private void SetUi() {
+ Log.i(TAG, "SetUi,learnMode : "+ learnMode);
+ if (learnMode == MODE_LEARN){
+ Log.i(TAG, "SetUi: 新单词模式");
+ Index = 0; //初始索引
+ NowId = wordsIdNeed.get(Index); //设置ID
+ setWordLearn();
+ }else if(learnMode == MODE_REVIEW){
+ Log.i(TAG, "SetUi: 复习单词模式");
+ Index = 0; //初始索引
+ NowId = wordsIdNeed.get(Index); //设置ID
+ setWordLearn();
+ }
+ }
+ private int judgeMode() {
+ wordsIdNeed = WordPlan.getNeedLearnIdList();
+ Log.i(TAG, "judgeMode:wordsIdNeed.size(): "+wordsIdNeed.size());
+ if(wordsIdNeed.size()==0){
+ wordsIdNeed = WordPlan.getNeedReview();
+ Log.i(TAG, "judgeMode:getNeedReview().size(): "+wordsIdNeed.size());
+ //没有需要新学习的单词
+ if(wordsIdNeed.size()==0){
+ //没有需要复习的单词
+ learnMode = MODE_NO;
+ Log.i(TAG, "judgeMode: 没有需要学习和复习的单词了");
+ Toast toast = Toast.makeText(this,"你已经完成了计划,休息一下吧!",Toast.LENGTH_LONG);
+ toast.show();
+ finish();
+ }else{
+ learnMode = MODE_REVIEW;
+ showReview();
+
+ }
+ }else {
+ learnMode = MODE_LEARN;
+ showLearn();
+ Log.i(TAG, "judgeMode: MODE_LEARN");
+ }
+ return learnMode;
}
- private void setWord() {
- cardTip.setVisibility(View.INVISIBLE); //影藏句子提醒
+ private void setChoice() {
+ wordMeanChoices.clear();
+ Interpretation word = LitePal.where("wordId = ?", + NowId + "").find(Interpretation.class).get(0);
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append(word.getWordType()).append(". ").append(word.getCHSMeaning());
+ List interpretationWrongs = LitePal.where("wordId != ?", NowId + "").find(Interpretation.class);
+ Collections.shuffle(interpretationWrongs);
+ if (recyclerView.getVisibility() == View.VISIBLE) {
+ wordMeanChoices.add(new ItemWordMeanChoice(NowId,stringBuilder.toString() , ItemWordMeanChoice.NOTSTART));
+ for (int i = 0; i < 3; ++i) {
+ wordMeanChoices.add(new ItemWordMeanChoice(-1, interpretationWrongs.get(i).getWordType() + ". " + interpretationWrongs.get(i).getCHSMeaning(), ItemWordMeanChoice.NOTSTART));
+ }
+ // 打乱顺序
+ Collections.shuffle(wordMeanChoices);
+ meanChoiceAdapter.notifyDataSetChanged();
+ setOnclick();
+ }
+ }
- List words = LitePal.where("wordId = ?", + NowId + "").find(Word.class);
- Log.i(TAG, String.valueOf(words.toArray().length));
- textWord.setText(words.get(0).getWord());
- //查询提示的句子
- List sentences = LitePal.where("wordId = ?", NowId + "").find(Sentence.class);
- if (!sentences.isEmpty())
+ private void setWordLearn() {
+ if (learnMode == MODE_LEARN) {
+ setChoice(); //新单词模式,给出选项
+ } else if (MODE_REVIEW == learnMode) {
+ //查询提示的句子
+ List sentences = LitePal.where("wordId = ?", NowId + "").find(Sentence.class);
tipSentence = sentences.get(0).getEnSentence();
+ }
+ List words = LitePal.where("wordId = ?", +NowId + "").find(Word.class);
+ Log.i(TAG, "setWordLearn: " + words.size());
+ textWord.setText(words.get(0).getWord()); // 给出单词
+ Log.i(TAG, "setWordLearn: " + words.get(0).getWord());
+ textWordPhone.setText(words.get(0).getUkPhone()); //给出音标
}
private void init() {
@@ -146,21 +225,18 @@ public class LearnWordActivity extends AppCompatActivity implements View.OnClick
}
break;
case R.id.card_no_know:
- WordDetailActivity.wordId = NowId;
- Intent intent = new Intent();
- intent.setClass(LearnWordActivity.this, WordDetailActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.putExtra(WordDetailActivity.TYPE_NAME, WordDetailActivity.TYPE_LEARN);
- startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(LearnWordActivity.this).toBundle());
+ onNoKnow();
break;
case R.id.card_know:
- NowId++;
- setWord();
+ WordPlan.setDegree(NowId,0);
+ NextWord(); //给出下一个单词
break;
case R.id.layout_word_tip:
-
+ showDetail();
break;
case R.id.layout_word_delete:
+ WordPlan.setDegree(NowId,6);
+ NextWord();
break;
case R.id.layout_word_voice:
MediaHelper.play(textWord.getText().toString());
@@ -168,6 +244,37 @@ public class LearnWordActivity extends AppCompatActivity implements View.OnClick
}
}
+ private void onNoKnow() {
+ showDetail();
+ NextWord();
+ }
+ private void showDetail(){
+ WordDetailActivity.wordId = NowId;
+ Intent intent = new Intent();
+ intent.setClass(LearnWordActivity.this, WordDetailActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(WordDetailActivity.TYPE_NAME, WordDetailActivity.TYPE_LEARN);
+ startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(LearnWordActivity.this).toBundle());
+ }
+
+ private void NextWord() {
+ Log.i(TAG, "NextWord: 给出下一个单词");
+ if (Index == wordsIdNeed.toArray().length - 1){
+ Log.i(TAG, "NextWord: 今日新单词已经学完!");
+ //新单词已经学完
+ judgeMode();//判断,看是否有新单词复习
+ if(learnMode == MODE_REVIEW){
+ Index = 0;
+ NowId = wordsIdNeed.get(Index);
+ setWordLearn();
+ }
+ }else{
+ Index++;
+ NowId = wordsIdNeed.get(Index);
+ setWordLearn();
+ }
+ }
+
@Override
public void onBackPressed() {
Intent intent = new Intent(LearnWordActivity.this, MainActivity.class);
@@ -179,17 +286,21 @@ public class LearnWordActivity extends AppCompatActivity implements View.OnClick
@Override
protected void onStart() {
super.onStart();
-
-
}
- private void showLearn() {
+ private void showReview() {
+ if(cardTip.getVisibility() == View.VISIBLE){
+ cardTip.setVisibility(View.INVISIBLE); //影藏句子提醒
+ }
recyclerView.setVisibility(View.GONE);
layoutBottomReview.setVisibility(View.GONE);
layoutBottomLearn.setVisibility(View.VISIBLE);
}
- private void showReview() {
+ private void showLearn() {
+ if(cardTip.getVisibility() == View.VISIBLE){
+ cardTip.setVisibility(View.INVISIBLE); //影藏句子提醒
+ }
recyclerView.setVisibility(View.VISIBLE);
layoutBottomReview.setVisibility(View.VISIBLE);
layoutBottomLearn.setVisibility(View.GONE);
@@ -200,4 +311,72 @@ public class LearnWordActivity extends AppCompatActivity implements View.OnClick
super.onDestroy();
}
+ private void setOnclick(){
+ meanChoiceAdapter.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(RecyclerView parent, View view, int position, ItemWordMeanChoice itemWordMeanChoice) {
+ if (MeanChoiceAdapter.isFirstClick) {
+ // 答错了
+ if (itemWordMeanChoice.getId() != NowId) {
+ itemWordMeanChoice.setRight(ItemWordMeanChoice.WRONG);
+ meanChoiceAdapter.notifyDataSetChanged();
+ MeanChoiceAdapter.isFirstClick = false;
+ answerWrong();
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ MeanChoiceAdapter.isFirstClick = true;
+ NextWord();
+ }
+ }, 500);
+ } else {
+ // 答对了
+ itemWordMeanChoice.setRight(ItemWordMeanChoice.RIGHT);
+ meanChoiceAdapter.notifyDataSetChanged();
+ MeanChoiceAdapter.isFirstClick = false;
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ MeanChoiceAdapter.isFirstClick = true;
+ answerRight();
+ //setWordMeanData();
+ }
+ }, 500);
+ }
+ }
+ }
+ });
+ }
+
+ private void answerRight() {
+ int degree = WordPlan.getDegree(NowId);
+ Log.i(TAG, "answerRight: getDegree"+degree);
+ WordPlan.setDegree(NowId,degree+1);
+ if(degree == 0){
+ //两天后检测
+ try {
+ WordPlan.setNewPlan(NowId);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ }
+ NextWord(); //给出下一个单词
+ }
+
+ private void answerWrong() {
+ WordDetailActivity.wordId = NowId;
+ WordPlan.setDegree(NowId,-1);//标记为生词
+ //两天后再次检测
+ try {
+ WordPlan.setNewPlan(NowId);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ Intent intent = new Intent();
+ intent.setClass(LearnWordActivity.this, WordDetailActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(WordDetailActivity.TYPE_NAME, WordDetailActivity.TYPE_LEARN);
+ startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(LearnWordActivity.this).toBundle());
+ }
+
}
diff --git a/app/src/main/java/com/example/testapp/MainActivity.java b/app/src/main/java/com/example/testapp/MainActivity.java
index 0a61f8b..8baedfc 100644
--- a/app/src/main/java/com/example/testapp/MainActivity.java
+++ b/app/src/main/java/com/example/testapp/MainActivity.java
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
+import android.media.Image;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -15,9 +16,16 @@ import android.widget.EditText;
import android.widget.Toast;
import com.example.testapp.Util.States;
+import com.example.testapp.Util.WordPlan;
+import com.example.testapp.database.Interpretation;
+import com.example.testapp.database.Phrase;
+import com.example.testapp.database.Sentence;
+import com.example.testapp.database.UserData;
+import com.example.testapp.database.Word;
import org.json.JSONException;
import org.json.JSONObject;
+import org.litepal.LitePal;
import java.io.BufferedReader;
import java.io.IOException;
@@ -70,6 +78,20 @@ public class MainActivity extends Activity {
public void onClick(View view) {
username = String.valueOf(edt_user.getText()); //获取文本框内容
password = String.valueOf(edt_password.getText());
+
+ //模拟登录成功数据
+ UserData userdata = new UserData();
+ userdata.setUserId(1);
+ userdata.setLogged(1);
+ userdata.save();
+ if (!LitePal.findAll(Word.class).isEmpty()) {
+ Log.i(TAG, String.valueOf(WordPlan.getUserId()));
+
+ }else{
+ Toast toast = Toast.makeText(MainActivity.this, "表是空的",Toast.LENGTH_SHORT);
+ toast.show();
+ }
+
Intent intent = new Intent(MainActivity.this, NavigationActivity.class);
startActivity(intent);
Log.i(TAG, States.getNetName(MainActivity.this)); //打印网络状态
@@ -82,7 +104,7 @@ public class MainActivity extends Activity {
btn_register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- Intent intent = new Intent(MainActivity.this,TestActivity.class);
+ Intent intent = new Intent(MainActivity.this, WordActivity.class);
startActivity(intent);
}
});
diff --git a/app/src/main/java/com/example/testapp/SetPlanActivity.java b/app/src/main/java/com/example/testapp/SetPlanActivity.java
new file mode 100644
index 0000000..bf8c0db
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/SetPlanActivity.java
@@ -0,0 +1,149 @@
+package com.example.testapp;
+
+import static android.content.ContentValues.TAG;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.annotation.SuppressLint;
+import android.icu.text.DateFormat;
+import android.icu.text.SimpleDateFormat;
+import android.icu.util.Calendar;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.bumptech.glide.Glide;
+import com.example.testapp.Util.TimeHelper;
+import com.example.testapp.Util.WordPlan;
+import com.example.testapp.config.ConstantData;
+import com.example.testapp.database.Word;
+
+import org.litepal.LitePal;
+import org.litepal.crud.callback.FindMultiCallback;
+
+import java.text.ParseException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class SetPlanActivity extends AppCompatActivity {
+ private Button planSure;
+ private ImageView bookImg;
+ private TextView wordNumText;
+ private TextView learnedNumText;
+ private EditText setNumEdt;
+ private Button numSure;
+ private TextView finishData;
+ private TextView bookTitle;
+
+
+ private int bookId = ConstantData.CET4_WORDBOOK;
+ private int TotalNum;
+ private int days;
+ private int planNum;
+ private static final int FINISH = 0;
+
+ @SuppressLint("HandlerLeak")
+ private Handler handler = new Handler(Looper.getMainLooper()) {
+ @Override
+ public void handleMessage(@NonNull Message msg) {
+ switch (msg.what) {
+ case FINISH:
+ Toast toast = Toast.makeText(SetPlanActivity.this,"完成",Toast.LENGTH_SHORT);
+ toast.show();
+ break;
+ }
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_set_plan);
+ planSure = findViewById(R.id.Plan_sure);
+ bookImg = findViewById(R.id.now_book_img);
+ wordNumText = findViewById(R.id.words_num);
+ learnedNumText = findViewById(R.id.learn_num);
+ setNumEdt = findViewById(R.id.daily_num);
+ numSure = findViewById(R.id.num_sure);
+ finishData = findViewById(R.id.finish_data);
+ bookTitle = findViewById(R.id.book_title);
+
+ setView();
+
+ numSure.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ planNum = Integer.parseInt(String.valueOf(setNumEdt.getText()));
+ days = TotalNum/planNum + 1;
+ finishData.setText("预计"+ days+ "天后背完");
+ }
+ });
+
+ planSure.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ WordPlan.setPlanNum(days);
+ try {
+ changeWordPlan();
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ bookImg.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ long timeNow = TimeHelper.getCurrentTimeStamp();
+ Log.i(TAG, "现在时间 "+timeNow);
+ List words = LitePal.where("masterDegree = ? AND planeTime < ?","0",timeNow+" ").find(Word.class);
+ for(Word word :words ){
+ Log.i(TAG, "onClick: "+word.getWord());
+ Log.i(TAG, "onClick: "+word.getPlaneTime());
+ }
+ }
+ });
+
+ }
+
+ private void changeWordPlan() throws ParseException {
+ List words = LitePal.where("masterDegree = ?","0").find(Word.class);
+ int day = 0;
+ int i = 0;
+ long time1 = TimeHelper.getCurrentTimeStamp(); //得到当前时间戳
+ for (Word word : words){
+ long time = TimeHelper.getDateByDays(time1,day);
+ word.setPlaneTime(time);
+ word.save();
+ i++;
+ if(i == planNum){
+ i = 0;
+ day++;
+ }
+ }
+ }
+
+
+ private void setView() {
+ Glide.with(bookImg).load(ConstantData.bookPicById(bookId)).into(bookImg);
+ bookTitle.setText(ConstantData.bookNameById(bookId));
+ wordNumText.setText("单词总数: "+ConstantData.wordTotalNumberById(bookId)+" 个");
+ TotalNum = ConstantData.wordTotalNumberById(bookId);
+ learnedNumText.setText("已经学习 " +WordPlan.getLearnedNum()+ "个单词");
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/Util/TimeHelper.java b/app/src/main/java/com/example/testapp/Util/TimeHelper.java
new file mode 100644
index 0000000..92935e1
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/Util/TimeHelper.java
@@ -0,0 +1,106 @@
+package com.example.testapp.Util;
+
+import android.util.Log;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/*时间管理*/
+public class TimeHelper {
+
+ public static final String FORMAT_NOTIME = "yyyy-MM-dd";
+
+ public static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FORMAT_NOTIME);
+
+ public static long todayDate;
+
+ private static final String TAG = "TimeController";
+
+ /*----日期类----*/
+
+ // 得到当前日期戳(不带时间,只有日期)
+ public static long getCurrentDateStamp() {
+ Calendar cal = Calendar.getInstance();
+ int currentYear = cal.get(Calendar.YEAR);
+ int currentMonth = cal.get(Calendar.MONTH) + 1;
+ int currentDate = cal.get(Calendar.DATE);
+ long time = 0;
+ try {
+ time = simpleDateFormat.parse(currentYear + "-" + currentMonth + "-" + currentDate).getTime();
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ Log.d(TAG, "getCurrentDateStamp: " + time);
+ return time;
+ }
+
+ // 根据指定日期戳解析成日期形式(yyyy-MM-dd)
+ public static String getStringDate(long timeStamp) {
+ return simpleDateFormat.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
+ }
+
+ // 根据指定日期戳解析成日期形式(yyyy-MM-dd)
+ public static String getStringDateDetail(long timeStamp) {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ return simpleDateFormat.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
+ }
+
+ // 得到当前日期的指定间隔后的日期
+ public static long getDateByDays(long time, int intervalDay) throws ParseException {
+ // 转换成Calendar
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(time);
+ calendar.add(Calendar.DATE, intervalDay);
+ return calendar.getTimeInMillis();
+ }
+
+ // 返回两个日期之间相隔多少天
+ public static int daysInternal(long time1, long time2) throws ParseException {
+ Date date1 = simpleDateFormat.parse(getStringDate(time1));
+ Date date2 = simpleDateFormat.parse(getStringDate(time2));
+ int days = (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24));
+ return days;
+ }
+
+ /*----时间类----*/
+
+ // 得到当前时间戳(有日期与时间)
+ public static long getCurrentTimeStamp() {
+ return System.currentTimeMillis();
+ }
+
+ // 判断两个时间戳是否为同一天
+ public static boolean isTheSameDay(long time1, long time2) {
+ return getStringDate(time1).equals(getStringDate(time2));
+ }
+
+ // 返回过去第几天的日期
+ public static String getPastDate(int past) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
+ Date today = calendar.getTime();
+ SimpleDateFormat format = new SimpleDateFormat("MM-dd");
+ String result = format.format(today);
+ return result;
+ }
+
+ // 返回过去第几天的日期(有年份)
+ public static String getPastDateWithYear(int past) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
+ Date today = calendar.getTime();
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+ String result = format.format(today);
+ return result;
+ }
+
+ // 获取n天以后的日期
+ public static String getDayAgoOrAfterString(int num) {
+ Calendar calendar1 = Calendar.getInstance();
+ SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日");
+ calendar1.add(Calendar.DATE, num);
+ return sdf1.format(calendar1.getTime());
+ }
+}
diff --git a/app/src/main/java/com/example/testapp/Util/WordPlan.java b/app/src/main/java/com/example/testapp/Util/WordPlan.java
new file mode 100644
index 0000000..d4305a3
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/Util/WordPlan.java
@@ -0,0 +1,107 @@
+package com.example.testapp.Util;
+
+
+import android.util.Log;
+
+import com.example.testapp.database.UserData;
+import com.example.testapp.database.Word;
+
+import org.litepal.LitePal;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class WordPlan {
+ public static String TAG = "WordPlan";
+
+ public static int getUserId() {
+ List userData = LitePal.where("logged = ?",+ 1 +"").find(UserData.class);
+ Log.i("当前ID",String.valueOf(userData.get(0).getUserId()));
+ return userData.get(0).getUserId();
+ }
+
+ public static void setPlanNum(int planNum){
+ //写入每次计划背诵的单词
+ int Userid = getUserId();
+ List userData = LitePal.where("UserId = ?",+Userid+"").find(UserData.class);
+ userData.get(0).setPlaneNum(planNum);
+ userData.get(0).save();
+ }
+
+ private static int getPlanNum(){
+ int Userid = getUserId();
+ List userData = LitePal.where("UserId = ?",+Userid+"").find(UserData.class);
+ return userData.get(0).getPlaneNum();
+ }
+
+ public static List getNeedLearn(){
+ //给出当天需要记忆的单词
+ int num = getPlanNum();
+ List list = null;
+ List words =LitePal.where("masterDegree = ?","0").find(Word.class);
+ if(words.toArray().length >num ){
+ list = words.subList(0,num);
+ }else {
+ list = words;
+ }
+ return list;
+ }
+
+ public static int getDegree(int wordId){
+ Word word =LitePal.where("wordId = ?",+wordId+"").find(Word.class).get(0);
+ return word.getMasterDegree();
+ }
+
+
+ public static void setDegree(int wordId, int degree){
+ Word word =LitePal.where("wordId = ?",+wordId+"").find(Word.class).get(0);
+ word.setMasterDegree(degree);
+ word.save();
+ }
+
+ public static int getLearnedNum(){
+ int Userid = getUserId();
+ List userData = LitePal.where("UserId = ?",+Userid+"").find(UserData.class);
+ return userData.get(0).getLearnedNum();
+ }
+ public static void setLearnedNum(int num){
+ int Userid = getUserId();
+ List userData = LitePal.where("UserId = ?",+Userid+"").find(UserData.class);
+ userData.get(0).setLearnedNum(num);
+ userData.get(0).save();
+ }
+
+ public static List getNeedLearnIdList(){
+ //给出今天需要学习的Id列表
+ long timeNow = TimeHelper.getCurrentTimeStamp();
+ List idList = new ArrayList<>();
+ Log.i(TAG, "现在时间 "+timeNow);
+ List words = LitePal.where("masterDegree < ? AND planeTime < ?","2",timeNow+" ").find(Word.class);
+ for(Word word :words ){
+ idList.add(word.getWordId());
+ Log.i(TAG, "getNeedLearnIdList: "+word.getWord());
+ Log.i(TAG, "getNeedLearnIdList: "+word.getPlaneTime());
+ }
+ return idList;
+ }
+
+ public static List getNeedReview(){
+ //给出今天需要复习的单词
+ List idList = new ArrayList<>();
+ List words = LitePal.where("masterDegree = ?","-1").select("wordId").find(Word.class);
+ for(Word word :words ){
+ idList.add(word.getWordId());
+ }
+ return idList;
+ }
+ public static void setNewPlan(int wordId) throws ParseException {
+ //设置两天后再次检测
+ int day = 2;
+ Word word = LitePal.where("wordId = ?",+wordId+"").find(Word.class).get(0);
+ long time1 = TimeHelper.getCurrentTimeStamp(); //得到当前时间戳
+ long time = TimeHelper.getDateByDays(time1,day);
+ word.setPlaneTime(time);
+ word.save();
+ }
+}
diff --git a/app/src/main/java/com/example/testapp/TestActivity.java b/app/src/main/java/com/example/testapp/WordActivity.java
similarity index 90%
rename from app/src/main/java/com/example/testapp/TestActivity.java
rename to app/src/main/java/com/example/testapp/WordActivity.java
index b08c001..3d8b6d5 100644
--- a/app/src/main/java/com/example/testapp/TestActivity.java
+++ b/app/src/main/java/com/example/testapp/WordActivity.java
@@ -18,17 +18,8 @@ import androidx.annotation.NonNull;
import com.example.testapp.Util.JsonHelper;
import com.example.testapp.bean.WordItem;
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
import java.util.List;
@@ -37,12 +28,12 @@ import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
-public class TestActivity extends Activity {
+public class WordActivity extends Activity {
Button buttonW;
Button buttonDownLoad;
EditText edt;
TextView textview;
- String TAG = "TestActivity";
+ String TAG = "WordActivity";
Boolean haveWrite = false;
String title;
String context;
@@ -82,7 +73,7 @@ public class TestActivity extends Activity {
buttonDownLoad.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- progressDialog = new ProgressDialog(TestActivity.this);
+ progressDialog = new ProgressDialog(WordActivity.this);
progressDialog.setTitle("请稍等");
progressDialog.setMessage("数据包正在下载中...");
progressDialog.setCancelable(false);
@@ -95,7 +86,7 @@ public class TestActivity extends Activity {
buttonW.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- Intent intent = new Intent(TestActivity.this,LearnWordActivity.class);
+ Intent intent = new Intent(WordActivity.this,LearnWordActivity.class);
startActivity(intent);
}
});
diff --git a/app/src/main/java/com/example/testapp/bean/BookData.java b/app/src/main/java/com/example/testapp/bean/BookData.java
index 2859902..7e969f6 100644
--- a/app/src/main/java/com/example/testapp/bean/BookData.java
+++ b/app/src/main/java/com/example/testapp/bean/BookData.java
@@ -8,4 +8,5 @@ public class BookData {
"https://nos.netease.com/ydschool-online/youdao_CET6_2.jpg",
"https://nos.netease.com/ydschool-online/youdao_KaoYan_2.jpg"
};
+
}
diff --git a/app/src/main/java/com/example/testapp/database/UserData.java b/app/src/main/java/com/example/testapp/database/UserData.java
new file mode 100644
index 0000000..ef473fe
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/database/UserData.java
@@ -0,0 +1,49 @@
+package com.example.testapp.database;
+
+
+import org.litepal.annotation.Column;
+import org.litepal.crud.LitePalSupport;
+
+public class UserData extends LitePalSupport {
+
+ @Column(unique = true)
+ private int UserId;
+
+ @Column(defaultValue = "0")
+ private int PlaneNum;
+ //每日计划背单词个数
+
+ @Column(defaultValue = "0")
+ private int LearnedNum;
+ //每日计划背单词个数
+
+ private int logged;
+
+ //logged :1 是当前登录,0不是当前登录
+
+ public void setLogged(int logged) {
+ this.logged = logged;
+ }
+
+ public int getUserId(){
+ return UserId;
+ }
+
+ public void setUserId(int id){
+ this.UserId = id;
+ }
+
+ public int getPlaneNum(){
+ return PlaneNum;
+ }
+ public void setPlaneNum(int userPlanNum){
+ this.PlaneNum = userPlanNum;
+ }
+
+ public int getLearnedNum(){
+ return LearnedNum;
+ }
+ public void setLearnedNum(int learnedNum){
+ this.LearnedNum = learnedNum;
+ }
+}
diff --git a/app/src/main/java/com/example/testapp/database/Word.java b/app/src/main/java/com/example/testapp/database/Word.java
index 2b61a6b..2447a8b 100644
--- a/app/src/main/java/com/example/testapp/database/Word.java
+++ b/app/src/main/java/com/example/testapp/database/Word.java
@@ -71,9 +71,9 @@ public class Word extends LitePalSupport {
@Column(defaultValue = "0")
private int examRightNum;
- // 上次已掌握时间(时间戳)
+ // 计划学习时间(时间戳)
@Column(defaultValue = "0")
- private long lastMasterTime;
+ private long planeTime;
// 上次复习的时间(时间戳)
@Column(defaultValue = "0")
@@ -246,12 +246,12 @@ public class Word extends LitePalSupport {
this.examRightNum = examRightNum;
}
- public long getLastMasterTime() {
- return lastMasterTime;
+ public long getPlaneTime() {
+ return planeTime;
}
- public void setLastMasterTime(long lastMasterTime) {
- this.lastMasterTime = lastMasterTime;
+ public void setPlaneTime(long PlaneTime) {
+ this.planeTime = PlaneTime;
}
public long getLastReviewTime() {
diff --git a/app/src/main/java/com/example/testapp/listener/CallBackListener.java b/app/src/main/java/com/example/testapp/listener/CallBackListener.java
new file mode 100644
index 0000000..81afa10
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/listener/CallBackListener.java
@@ -0,0 +1,14 @@
+package com.example.testapp.listener;
+
+import java.io.IOException;
+
+import okhttp3.Call;
+import okhttp3.Response;
+
+public interface CallBackListener {
+
+ public void onFailure(Call call, IOException e);
+
+ public void onResponse(Call call, Response response) throws IOException;
+
+}
diff --git a/app/src/main/java/com/example/testapp/listener/OnItemClickListener.java b/app/src/main/java/com/example/testapp/listener/OnItemClickListener.java
new file mode 100644
index 0000000..ce0af6e
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/listener/OnItemClickListener.java
@@ -0,0 +1,14 @@
+package com.example.testapp.listener;
+
+import android.view.View;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.testapp.entity.ItemWordMeanChoice;
+
+
+public interface OnItemClickListener {
+
+ void onItemClick(RecyclerView parent, View view, int position, ItemWordMeanChoice itemWordMeanChoice);
+
+}
diff --git a/app/src/main/java/com/example/testapp/listener/PermissionListener.java b/app/src/main/java/com/example/testapp/listener/PermissionListener.java
new file mode 100644
index 0000000..aaf646b
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/listener/PermissionListener.java
@@ -0,0 +1,14 @@
+package com.example.testapp.listener;
+
+import java.util.List;
+
+public interface PermissionListener {
+
+ //已授权
+ void onGranted();
+
+ //未授权
+ void onDenied(List deniedPermission);
+
+
+}
diff --git a/app/src/main/java/com/example/testapp/ui/home/HomeFragment.java b/app/src/main/java/com/example/testapp/ui/home/HomeFragment.java
index ec397f4..fa958eb 100644
--- a/app/src/main/java/com/example/testapp/ui/home/HomeFragment.java
+++ b/app/src/main/java/com/example/testapp/ui/home/HomeFragment.java
@@ -12,6 +12,7 @@ import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
+import com.example.testapp.SetPlanActivity;
import com.example.testapp.WordBook;
import com.example.testapp.databinding.FragmentHomeBinding;
@@ -19,6 +20,7 @@ public class HomeFragment extends Fragment {
private FragmentHomeBinding binding;
Button bookManageBtn;
+ Button plan;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
@@ -28,6 +30,14 @@ public class HomeFragment extends Fragment {
binding = FragmentHomeBinding.inflate(inflater, container, false);
View root = binding.getRoot();
bookManageBtn = binding.bookManger;
+ plan = binding.plan;
+ plan.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(getContext(), SetPlanActivity.class);
+ startActivity(intent);
+ }
+ });
bookManageBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
diff --git a/app/src/main/res/layout/activity_set_plan.xml b/app/src/main/res/layout/activity_set_plan.xml
new file mode 100644
index 0000000..c51085b
--- /dev/null
+++ b/app/src/main/res/layout/activity_set_plan.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_test.xml b/app/src/main/res/layout/activity_test.xml
index ed997d3..ccafb73 100644
--- a/app/src/main/res/layout/activity_test.xml
+++ b/app/src/main/res/layout/activity_test.xml
@@ -5,7 +5,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context=".TestActivity">
+ tools:context=".WordActivity">
词书管理
下载词书
+ 当前词书
+ 设定计划
+ 请输入每日记忆单词个数
+ 预计 9999 天后背完
\ No newline at end of file
--
GitLab