提交 25cf3793 编写于 作者: 勇敢di牛牛's avatar 勇敢di牛牛

制定单词计划功能的实现

上级 7ca2533b
......@@ -34,6 +34,7 @@
<entry key="..\:/Android Toos/Android project/app/src/main/res/layout/activity_main.xml" value="0.2" />
<entry key="..\:/Android Toos/Android project/app/src/main/res/layout/activity_navigation.xml" value="0.12601626016260162" />
<entry key="..\:/Android Toos/Android project/app/src/main/res/layout/activity_recite_word.xml" value="0.3333333333333333" />
<entry key="..\:/Android Toos/Android project/app/src/main/res/layout/activity_set_plan.xml" value="0.1" />
<entry key="..\:/Android Toos/Android project/app/src/main/res/layout/activity_test.xml" value="0.17916666666666667" />
<entry key="..\:/Android Toos/Android project/app/src/main/res/layout/activity_translate_paragraph.xml" value="0.1" />
<entry key="..\:/Android Toos/Android project/app/src/main/res/layout/activity_translate_paragraph2.xml" value="0.11614583333333334" />
......
......@@ -17,7 +17,10 @@
android:theme="@style/Theme.TestApp"
android:usesCleartextTraffic="true">
<activity
android:name=".TestActivity"
android:name=".SetPlanActivity"
android:exported="false" />
<activity
android:name=".WordActivity"
android:exported="false" />
<activity
android:name=".ReciteWord"
......
......@@ -7,6 +7,7 @@
<mapping class="com.example.testapp.database.Interpretation" />
<mapping class="com.example.testapp.database.Phrase" />
<mapping class="com.example.testapp.database.Sentence" />
<mapping class="com.example.testapp.database.UserData" />
</list>
</litepal>
\ No newline at end of file
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<MeanChoiceAdapter.ViewHolder> implements View.OnClickListener {
// 判断是否是第一次点击
public static boolean isFirstClick = true;
private RecyclerView recyclerView;
private List<ItemWordMeanChoice> 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<ItemWordMeanChoice> 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();
}
}
......@@ -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<Integer> 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<Interpretation> 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<Word> words = LitePal.where("wordId = ?", + NowId + "").find(Word.class);
Log.i(TAG, String.valueOf(words.toArray().length));
textWord.setText(words.get(0).getWord());
//查询提示的句子
List<Sentence> 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<Sentence> sentences = LitePal.where("wordId = ?", NowId + "").find(Sentence.class);
tipSentence = sentences.get(0).getEnSentence();
}
List<Word> 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());
}
}
......@@ -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);
}
});
......
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<Word> 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<Word> 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
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());
}
}
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> 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> 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> userData = LitePal.where("UserId = ?",+Userid+"").find(UserData.class);
return userData.get(0).getPlaneNum();
}
public static List<Word> getNeedLearn(){
//给出当天需要记忆的单词
int num = getPlanNum();
List<Word> list = null;
List<Word> 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> userData = LitePal.where("UserId = ?",+Userid+"").find(UserData.class);
return userData.get(0).getLearnedNum();
}
public static void setLearnedNum(int num){
int Userid = getUserId();
List<UserData> userData = LitePal.where("UserId = ?",+Userid+"").find(UserData.class);
userData.get(0).setLearnedNum(num);
userData.get(0).save();
}
public static List<Integer> getNeedLearnIdList(){
//给出今天需要学习的Id列表
long timeNow = TimeHelper.getCurrentTimeStamp();
List<Integer> idList = new ArrayList<>();
Log.i(TAG, "现在时间 "+timeNow);
List<Word> 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<Integer> getNeedReview(){
//给出今天需要复习的单词
List<Integer> idList = new ArrayList<>();
List<Word> 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();
}
}
......@@ -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);
}
});
......
......@@ -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"
};
}
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;
}
}
......@@ -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() {
......
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;
}
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);
}
package com.example.testapp.listener;
import java.util.List;
public interface PermissionListener {
//已授权
void onGranted();
//未授权
void onDenied(List<String> deniedPermission);
}
......@@ -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) {
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".SetPlanActivity">
<TextView
android:text="@string/NowBook"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:paddingStart="15dp"
tools:ignore="RtlSymmetry" />
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="150dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/now_book_img"
android:layout_width="160dp"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:scaleType="fitCenter"
android:src="@drawable/translate" />
<TextView
android:id="@+id/book_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="5dp"
android:layout_toEndOf="@+id/now_book_img"
android:text="词书标题"
android:textSize="22sp" />
<TextView
android:id="@+id/words_num"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginStart="20dp"
android:layout_marginTop="50dp"
android:layout_toEndOf="@+id/now_book_img"
android:text="单词总数:500个"
android:textSize="18dp" />
<TextView
android:id="@+id/learn_num"
android:layout_below="@+id/words_num"
android:layout_toEndOf="@+id/now_book_img"
android:layout_marginStart="20dp"
android:text="已经学习 0 个"
android:textSize="18dp"
android:layout_width="wrap_content"
android:layout_height="50dp"/>
</RelativeLayout>
</androidx.cardview.widget.CardView>
<TextView
android:text="@string/setPlan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:paddingTop="15dp"
android:paddingStart="15dp"
tools:ignore="RtlSymmetry" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:orientation="horizontal">
<EditText
android:paddingTop="20dp"
android:paddingStart="15dp"
android:id="@+id/daily_num"
android:inputType="number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/daily_num"/>
<Button
android:layout_marginLeft="10dp"
android:id="@+id/num_sure"
android:background="@drawable/btn_white"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确定" />
</LinearLayout>
<TextView
android:paddingTop="50dp"
android:id="@+id/finish_data"
android:textSize="25sp"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/finish_data"/>
<Button
android:id="@+id/Plan_sure"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:textSize="20sp"
android:text="保 存 当 前 计 划"
android:background="@color/btn_blue"
android:layout_marginTop="60dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
\ No newline at end of file
......@@ -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">
<Button
android:id="@+id/button1"
......
......@@ -15,7 +15,7 @@
/>
<Button
android:layout_marginStart="100dp"
android:id="@+id/btn_recite_word"
android:id="@+id/plan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="词书管理"
......
......@@ -23,5 +23,9 @@
<string name="translate_title">段落翻译</string>
<string name="word_books">词书管理</string>
<string name="down_word_book">下载词书</string>
<string name="NowBook">当前词书</string>
<string name="setPlan">设定计划</string>
<string name="daily_num">请输入每日记忆单词个数</string>
<string name="finish_data">预计 9999 天后背完</string>
</resources>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册