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 @@ + + + + + + + + + + + + + + + + + + + + +