个人作业安卓端
package com.example.blogapp.activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blogapp.R;
import com.example.blogapp.activity.SummaryStatsAdapter;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.ApiService;
import java.util.List;
import java.util.Map;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class AllSummaryStatsActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private SummaryStatsAdapter adapter;
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_all_summary_stats);
recyclerView = findViewById(R.id.recyclerView);
progressBar = findViewById(R.id.progressBar);
// 设置 RecyclerView
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new SummaryStatsAdapter();
recyclerView.setAdapter(adapter);
loadStudentSummaryStats();
}
private void loadStudentSummaryStats() {
progressBar.setVisibility(View.VISIBLE);
// 使用正确的 Retrofit 客户端
ApiService apiService ;
apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(com.example.blogapp.ApiService.class);
Call<ApiResponse<List<Map<String, Object>>>> call = apiService.getStudentSummaryStats();
call.enqueue(new Callback<ApiResponse<List<Map<String, Object>>>>() {
@Override
public void onResponse(Call<ApiResponse<List<Map<String, Object>>>> call,
Response<ApiResponse<List<Map<String, Object>>>> response) {
progressBar.setVisibility(View.GONE);
if (response.isSuccessful() && response.body() != null) {
List<Map<String, Object>> statsList = response.body().getData();
adapter.setData(statsList);
} else {
Toast.makeText(AllSummaryStatsActivity.this,
"获取数据失败", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ApiResponse<List<Map<String, Object>>>> call, Throwable t) {
progressBar.setVisibility(View.GONE);
Toast.makeText(AllSummaryStatsActivity.this,
"网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}package com.example.blogapp.activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blogapp.R;
import com.example.blogapp.model.CodingRecord;
import com.example.blogapp.activity.CodingRecordAdapter;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.utils.SecureStorage;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class CodingRecordActivity extends AppCompatActivity {
private EditText planningContentEditText;
private EditText planningTimeEditText;
private EditText analysisContentEditText;
private EditText analysisTimeEditText;
private EditText designSpecContentEditText;
private EditText designSpecTimeEditText;
private EditText codingStandardContentEditText;
private EditText codingStandardTimeEditText;
private EditText designContentEditText;
private EditText designTimeEditText;
private EditText codingContentEditText;
private EditText codingTimeEditText;
private EditText testContentEditText;
private EditText testTimeEditText;
private EditText sizeMeasurementContentEditText;
private EditText sizeMeasurementTimeEditText;
private EditText postmortemContentEditText;
private EditText postmortemTimeEditText;
private EditText totalTimeEditText;
private RecyclerView recyclerView;
private CodingRecordAdapter adapter;
private com.example.blogapp.ApiService apiService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_coding_record);
// 初始化控件
planningContentEditText = findViewById(R.id.planningContent);
planningTimeEditText = findViewById(R.id.planningTime);
analysisContentEditText = findViewById(R.id.analysisContent);
analysisTimeEditText = findViewById(R.id.analysisTime);
designSpecContentEditText = findViewById(R.id.designSpecContent);
designSpecTimeEditText = findViewById(R.id.designSpecTime);
codingStandardContentEditText = findViewById(R.id.codingStandardContent);
codingStandardTimeEditText = findViewById(R.id.codingStandardTime);
designContentEditText = findViewById(R.id.designContent);
designTimeEditText = findViewById(R.id.designTime);
codingContentEditText = findViewById(R.id.codingContent);
codingTimeEditText = findViewById(R.id.codingTime);
testContentEditText = findViewById(R.id.testContent);
testTimeEditText = findViewById(R.id.testTime);
sizeMeasurementContentEditText = findViewById(R.id.sizeMeasurementContent);
sizeMeasurementTimeEditText = findViewById(R.id.sizeMeasurementTime);
postmortemContentEditText = findViewById(R.id.postmortemContent);
postmortemTimeEditText = findViewById(R.id.postmortemTime);
totalTimeEditText = findViewById(R.id.totalTime);
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new CodingRecordAdapter();
recyclerView.setAdapter(adapter);
// 初始化 Retrofit
apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(com.example.blogapp.ApiService.class);
// 加载编程记录
loadCodingRecords();
// 设置保存记录按钮点击事件
findViewById(R.id.btn_save).setOnClickListener(v -> saveCodingRecord());
}
private void loadCodingRecords() {
String userId = SecureStorage.getUserId(this);
if (userId == null || userId.isEmpty()) {
Toast.makeText(this, "用户ID为空,请先登录", Toast.LENGTH_SHORT).show();
return;
}
Call<List<CodingRecord>> call = apiService.getCodingRecords(userId);
call.enqueue(new Callback<List<CodingRecord>>() {
@Override
public void onResponse(Call<List<CodingRecord>> call, Response<List<CodingRecord>> response) {
if (response.isSuccessful() && response.body() != null) {
List<CodingRecord> records = response.body();
Log.d("CodingRecordActivity", "获取到数据: " + records.size() + "条");
adapter.setData(records);
} else {
Log.e("CodingRecordActivity", "响应不成功: " + response.code());
}
}
@Override
public void onFailure(Call<List<CodingRecord>> call, Throwable t) {
Log.e("CodingRecordActivity", "加载失败", t);
Toast.makeText(CodingRecordActivity.this, "加载失败: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
private void saveCodingRecord() {
// 获取用户ID(确保已登录)
String userId = SecureStorage.getUserId(this);
if (userId == null || userId.isEmpty()) {
Toast.makeText(this, "请先登录", Toast.LENGTH_SHORT).show();
return;
}
// 获取输入值
String planningContent = planningContentEditText.getText().toString();
Integer planningTime = Integer.parseInt(planningTimeEditText.getText().toString());
String analysisContent = analysisContentEditText.getText().toString();
Integer analysisTime = Integer.parseInt(analysisTimeEditText.getText().toString());
String designSpecContent = designSpecContentEditText.getText().toString();
Integer designSpecTime = Integer.parseInt(designSpecTimeEditText.getText().toString());
String codingStandardContent = codingStandardContentEditText.getText().toString();
Integer codingStandardTime = Integer.parseInt(codingStandardTimeEditText.getText().toString());
String designContent = designContentEditText.getText().toString();
Integer designTime = Integer.parseInt(designTimeEditText.getText().toString());
String codingContent = codingContentEditText.getText().toString();
Integer codingTime = Integer.parseInt(codingTimeEditText.getText().toString());
String testContent = testContentEditText.getText().toString();
Integer testTime = Integer.parseInt(testTimeEditText.getText().toString());
String sizeMeasurementContent = sizeMeasurementContentEditText.getText().toString();
Integer sizeMeasurementTime = Integer.parseInt(sizeMeasurementTimeEditText.getText().toString());
String postmortemContent = postmortemContentEditText.getText().toString();
Integer postmortemTime = Integer.parseInt(postmortemTimeEditText.getText().toString());
Integer totalTime = Integer.parseInt(totalTimeEditText.getText().toString());
// 创建 CodingRecord 对象
CodingRecord codingRecord = new CodingRecord();
codingRecord.setPlanningContent(planningContent);
codingRecord.setPlanningTime(planningTime);
codingRecord.setAnalysisContent(analysisContent);
codingRecord.setAnalysisTime(analysisTime);
codingRecord.setDesignSpecContent(designSpecContent);
codingRecord.setDesignSpecTime(designSpecTime);
codingRecord.setCodingStandardContent(codingStandardContent);
codingRecord.setCodingStandardTime(codingStandardTime);
codingRecord.setDesignContent(designContent);
codingRecord.setDesignTime(designTime);
codingRecord.setCodingContent(codingContent);
codingRecord.setCodingTime(codingTime);
codingRecord.setTestContent(testContent);
codingRecord.setTestTime(testTime);
codingRecord.setSizeMeasurementContent(sizeMeasurementContent);
codingRecord.setSizeMeasurementTime(sizeMeasurementTime);
codingRecord.setPostmortemContent(postmortemContent);
codingRecord.setPostmortemTime(postmortemTime);
codingRecord.setTotalTime(totalTime);
// 创建 CodingRecord 对象并设置 userId
codingRecord.setUserId(userId); // 关键修复:设置用户ID
// 调用 Retrofit 接口
Call<Void> call = apiService.addCodingRecord(codingRecord);
call.enqueue(new Callback<Void>() {
@Override
public void onResponse(Call<Void> call, Response<Void> response) {
if (response.isSuccessful()) {
loadCodingRecords();
Toast.makeText(CodingRecordActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
loadCodingRecords(); // 刷新列表
}
}
@Override
public void onFailure(Call<Void> call, Throwable t) {
Toast.makeText(CodingRecordActivity.this, "保存失败", Toast.LENGTH_SHORT).show();
}
});
}
}package com.example.blogapp.activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blogapp.R;
import com.example.blogapp.model.CodingRecord;
import java.util.List;
public class CodingRecordAdapter extends RecyclerView.Adapter<CodingRecordAdapter.CodingRecordViewHolder> {
private List
public void setData(List<CodingRecord> codingRecords) {
this.codingRecords = codingRecords;
notifyDataSetChanged();
}
@NonNull
@Override
public CodingRecordViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_coding_record, parent, false);
return new CodingRecordViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull CodingRecordViewHolder holder, int position) {
CodingRecord record = codingRecords.get(position);
holder.bind(record);
}
@Override
public int getItemCount() {
return codingRecords == null ? 0 : codingRecords.size();
}
public static class CodingRecordViewHolder extends RecyclerView.ViewHolder {
private TextView dateTextView;
private TextView planningTimeTextView;
private TextView analysisTimeTextView;
private TextView designSpecTimeTextView;
private TextView codingStandardTimeTextView;
private TextView designTimeTextView;
private TextView codingTimeTextView;
private TextView testTimeTextView;
private TextView sizeMeasurementTimeTextView;
private TextView postmortemTimeTextView;
private TextView totalTimeTextView;
public CodingRecordViewHolder(View itemView) {
super(itemView);
dateTextView = itemView.findViewById(R.id.dateTextView);
planningTimeTextView = itemView.findViewById(R.id.planningTimeTextView);
analysisTimeTextView = itemView.findViewById(R.id.analysisTimeTextView);
designSpecTimeTextView = itemView.findViewById(R.id.designSpecTimeTextView);
codingStandardTimeTextView = itemView.findViewById(R.id.codingStandardTimeTextView);
designTimeTextView = itemView.findViewById(R.id.designTimeTextView);
codingTimeTextView = itemView.findViewById(R.id.codingTimeTextView);
testTimeTextView = itemView.findViewById(R.id.testTimeTextView);
sizeMeasurementTimeTextView = itemView.findViewById(R.id.sizeMeasurementTimeTextView);
postmortemTimeTextView = itemView.findViewById(R.id.postmortemTimeTextView);
totalTimeTextView = itemView.findViewById(R.id.totalTimeTextView);
}
public void bind(CodingRecord record) {
// 设置日期
dateTextView.setText(record.getDate() != null ?
"日期: " + record.getDate() : "无日期");
// 设置各阶段时间
planningTimeTextView.setText(String.valueOf(record.getPlanningTime()));
analysisTimeTextView.setText(String.valueOf(record.getAnalysisTime()));
designSpecTimeTextView.setText(String.valueOf(record.getDesignSpecTime()));
codingStandardTimeTextView.setText(String.valueOf(record.getCodingStandardTime()));
designTimeTextView.setText(String.valueOf(record.getDesignTime()));
codingTimeTextView.setText(String.valueOf(record.getCodingTime()));
testTimeTextView.setText(String.valueOf(record.getTestTime()));
sizeMeasurementTimeTextView.setText(String.valueOf(record.getSizeMeasurementTime()));
postmortemTimeTextView.setText(String.valueOf(record.getPostmortemTime()));
// 设置合计时间
totalTimeTextView.setText(String.valueOf(record.getTotalTime()));
}
}
}package com.example.blogapp.activity;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blogapp.DailySummaryResponse;
import com.example.blogapp.R;
import com.example.blogapp.model.DailySummary;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Locale;
// DailySummaryAdapter.java
public class DailySummaryAdapter extends RecyclerView.Adapter<DailySummaryAdapter.ViewHolder> {
private final List
public DailySummaryAdapter(List<DailySummaryResponse> summaryList) {
this.summaryList = summaryList;
}
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
private final SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_daily_summary, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
DailySummaryResponse item = summaryList.get(position);
holder.dateText.setText(item.getSummaryDate());
holder.userIdText.setText(String.valueOf(item.getUserId()));
holder.blogUrlText.setText(item.getBlogUrl());
holder.createTimeText.setText(item.getFormattedCreateTime());
// 点击事件
holder.blogUrlText.setOnClickListener(v -> {
if (item.getBlogUrl() != null) {
holder.itemView.getContext().startActivity(
new Intent(Intent.ACTION_VIEW, Uri.parse(item.getBlogUrl())));
}
});
}
// ... 其他代码不变
@Override
public int getItemCount() {
return summaryList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView dateText;
TextView userIdText;
TextView blogUrlText;
TextView createTimeText;
public ViewHolder(@NonNull View itemView) {
super(itemView);
dateText = itemView.findViewById(R.id.dateText);
userIdText = itemView.findViewById(R.id.userIdText);
blogUrlText = itemView.findViewById(R.id.blogUrlText);
createTimeText = itemView.findViewById(R.id.createTimeText);
}
}
}
package com.example.blogapp.activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.blogapp.ApiService;
import com.example.blogapp.R;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.model.WeeklyGoal;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.utils.SecureStorage;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class GoalActivity extends AppCompatActivity {
private ApiService apiService;
private TextView tvCurrentGoal;
private EditText etGoal;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().hide();
setContentView(R.layout.activity_goal);
// 初始化 Retrofit
apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(ApiService.class);
tvCurrentGoal = findViewById(R.id.tv_current_goal);
etGoal = findViewById(R.id.et_goal);
// 从 SecureStorage 获取用户 ID
String userId = SecureStorage.getUserId(this);
if (userId == null || userId.isEmpty()) {
Toast.makeText(this, "请先登录", Toast.LENGTH_SHORT).show();
startActivity(new Intent(this, LoginActivity.class));
finish();
return;
}
loadCurrentGoal(Long.parseLong(userId));
findViewById(R.id.btn_set_goal).setOnClickListener(v -> setGoal(Long.parseLong(userId)));
}
private void loadCurrentGoal(Long userId) {
Call<ApiResponse<WeeklyGoal>> call = apiService.getCurrentGoal(userId);
call.enqueue(new Callback<ApiResponse<WeeklyGoal>>() {
@Override
public void onResponse(Call<ApiResponse<WeeklyGoal>> call, Response<ApiResponse<WeeklyGoal>> response) {
if (response.isSuccessful() && response.body() != null && response.body().getData() != null) {
WeeklyGoal goal = response.body().getData();
runOnUiThread(() -> {
tvCurrentGoal.setText("本周目标: " + goal.getContent());
});
} else {
runOnUiThread(() -> {
tvCurrentGoal.setText("暂无本周学习目标");
});
}
}
@Override
public void onFailure(Call<ApiResponse<WeeklyGoal>> call, Throwable t) {
runOnUiThread(() -> {
tvCurrentGoal.setText("加载失败");
Toast.makeText(GoalActivity.this, "加载失败: " + t.getMessage(), Toast.LENGTH_SHORT).show();
});
}
});
}
private void setGoal(Long userId) {
String content = etGoal.getText().toString();
Call<ApiResponse<Void>> call = apiService.setWeeklyGoal(content, userId);
call.enqueue(new Callback<ApiResponse<Void>>() {
@Override
public void onResponse(Call<ApiResponse<Void>> call, Response<ApiResponse<Void>> response) {
if (response.isSuccessful()) {
loadCurrentGoal(userId);
Toast.makeText(GoalActivity.this, "设置成功", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ApiResponse<Void>> call, Throwable t) {
Toast.makeText(GoalActivity.this, "设置失败", Toast.LENGTH_SHORT).show();
}
});
}
}
package com.example.blogapp.activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.example.blogapp.R;
import com.example.blogapp.activity.LoginActivity;
import com.example.blogapp.utils.SecureStorage;
public class HomeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
// 初始化控件
TextView welcomeText = findViewById(R.id.welcomeText);
TextView userIdText = findViewById(R.id.userIdText);
TextView userClassText = findViewById(R.id.userClassText);
Button logoutButton = findViewById(R.id.logoutButton);
Button codingRecordsButton = findViewById(R.id.codingRecordsButton);
// 获取用户信息
String username = SecureStorage.getUsername(this); // 假设你已存储用户名
String userId = SecureStorage.getUserId(this);
String userClass = SecureStorage.getUserClass(this);
// 设置欢迎信息
welcomeText.setText("欢迎, " + username + "!");
userIdText.setText("学号: " + userId);
userClassText.setText("班级: " + userClass);
// 设置每日总结按钮点击事件
findViewById(R.id.summaryButton).setOnClickListener(v -> {
Intent intent = new Intent(HomeActivity.this, SummaryActivity.class);
startActivity(intent);
});
// 设置每周目标按钮点击事件
findViewById(R.id.goalButton).setOnClickListener(v -> {
Intent intent = new Intent(HomeActivity.this, GoalActivity.class);
startActivity(intent);
});
// 设置每日编程记录按钮点击事件
codingRecordsButton.setOnClickListener(v -> {
Intent intent = new Intent(HomeActivity.this, CodingRecordActivity.class);
startActivity(intent);
});
// 设置退出登录按钮点击事件
logoutButton.setOnClickListener(v -> {
SecureStorage.clearUserDetails(this); // 清除用户信息
Intent intent = new Intent(HomeActivity.this, LoginActivity.class);
startActivity(intent);
finish();
});
}
}package com.example.blogapp.activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.blogapp.R;
import com.example.blogapp.ApiService;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.model.User;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.utils.SecureStorage;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class LoginActivity extends AppCompatActivity {
private EditText userIdEditText;
private EditText passwordEditText;
private RadioButton studentRadioButton;
private RadioButton teacherRadioButton;
private ApiService apiService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
userIdEditText = findViewById(R.id.userIdEditText);
passwordEditText = findViewById(R.id.passwordEditText);
studentRadioButton = findViewById(R.id.studentRadioButton);
teacherRadioButton = findViewById(R.id.teacherRadioButton);
// 初始化 Retrofit 客户端和服务接口
apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(ApiService.class);
findViewById(R.id.loginButton).setOnClickListener(v -> loginUser());
findViewById(R.id.registerTextView).setOnClickListener(v -> {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
});
}
private void loginUser() {
String userId = userIdEditText.getText().toString();
String password = passwordEditText.getText().toString();
String role = studentRadioButton.isChecked() ? "student" : "teacher";
Call<ApiResponse<User>> call = apiService.login(userId, password, role);
call.enqueue(new Callback<ApiResponse<User>>() {
@Override
public void onResponse(Call<ApiResponse<User>> call, Response<ApiResponse<User>> response) {
// 在登录成功的回调中修改
if (response.isSuccessful()) {
ApiResponse<User> apiResponse = response.body();
if (apiResponse != null && apiResponse.getStatus() == 200) {
User user = apiResponse.getData();
// 保存用户信息
SecureStorage.saveUserDetails(LoginActivity.this,
user.getUserId(),
user.getRole(),
user.getUsername(),
user.getUserClass());
// 根据角色跳转
if ("teacher".equals(user.getRole())) {
startActivity(new Intent(LoginActivity.this, TeacherDashboardActivity.class));
} else {
startActivity(new Intent(LoginActivity.this, HomeActivity.class));
}
finish();
}
}
}
@Override
public void onFailure(Call<ApiResponse<User>> call, Throwable t) {
Toast.makeText(LoginActivity.this, "网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}package com.example.blogapp.activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.example.blogapp.R;
import com.example.blogapp.ApiService;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.model.User;
import com.example.blogapp.utils.SecureStorage;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity {
private ApiService apiService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
// 初始化 Retrofit 客户端和服务接口
apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(ApiService.class);
// 从 SecureStorage 获取用户 ID 和角色
String userId = SecureStorage.getUserId(this);
String userRole = SecureStorage.getUserRole(this);
if (userId == null || userId.isEmpty() || userRole == null || userRole.isEmpty()) {
startActivity(new Intent(MainActivity.this, LoginActivity.class));
finish();
return;
}
// 发起请求获取当前用户信息
Call<ApiResponse<User>> call = apiService.getCurrentUser(userId, userRole);
call.enqueue(new Callback<ApiResponse<User>>() {
@Override
public void onResponse(Call<ApiResponse<User>> call, Response<ApiResponse<User>> response) {
if (response.isSuccessful() && response.body() != null) {
User user = response.body().getData();
updateUI(user);
} else {
Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ApiResponse<User>> call, Throwable t) {
Toast.makeText(MainActivity.this, "网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
private void updateUI(User user) {
Intent intent = new Intent(MainActivity.this, HomeActivity.class);
startActivity(intent);
finish();
}
}package com.example.blogapp.activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.blogapp.R;
import com.example.blogapp.ApiService;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.model.User;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class RegisterActivity extends AppCompatActivity {
private EditText userIdEditText;
private EditText usernameEditText;
private EditText passwordEditText;
private EditText phoneEditText;
private EditText userClassEditText;
private RadioButton studentRadioButton;
private RadioButton teacherRadioButton;
private ApiService apiService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
userIdEditText = findViewById(R.id.userIdEditText);
usernameEditText = findViewById(R.id.usernameEditText);
passwordEditText = findViewById(R.id.passwordEditText);
phoneEditText = findViewById(R.id.phoneEditText);
userClassEditText = findViewById(R.id.userClassEditText);
studentRadioButton = findViewById(R.id.studentRadioButton);
teacherRadioButton = findViewById(R.id.teacherRadioButton);
apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(ApiService.class);
findViewById(R.id.registerButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
registerUser();
}
});
findViewById(R.id.loginTextView).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
}
});
}
private void registerUser() {
String userId = userIdEditText.getText().toString();
String username = usernameEditText.getText().toString();
String password = passwordEditText.getText().toString();
String phone = phoneEditText.getText().toString();
String userClass = userClassEditText.getText().toString();
String role = studentRadioButton.isChecked() ? "student" : "teacher";
User user = new User();
user.setUserId(userId);
user.setUsername(username);
user.setPassword(password);
user.setPhone(phone);
user.setUserClass(userClass);
user.setRole(role);
Log.d("Register", "Registering user with role: " + role);
// 调用接口(返回 ApiResponse)
Call<ApiResponse<Void>> call = apiService.register(user);
call.enqueue(new Callback<ApiResponse<Void>>() {
@Override
public void onResponse(Call<ApiResponse<Void>> call, Response<ApiResponse<Void>> response) {
if (response.isSuccessful()) {
ApiResponse<Void> apiResponse = response.body();
if (apiResponse != null && apiResponse.getStatus() == 200) {
Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
startActivity(new Intent(RegisterActivity.this, LoginActivity.class));
} else {
String errorMsg = apiResponse != null ? apiResponse.getMessage() : "未知错误";
Toast.makeText(RegisterActivity.this, "注册失败:" + errorMsg, Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(RegisterActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ApiResponse<Void>> call, Throwable t) {
Toast.makeText(RegisterActivity.this, "网络错误:" + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}package com.example.blogapp.activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blogapp.R;
import com.example.blogapp.model.CodingRecord;
import com.example.blogapp.model.DailySummary;
import java.util.ArrayList;
import java.util.List;
public class StatsAdapter extends RecyclerView.Adapter<StatsAdapter.ViewHolder> {
private List
public void setRecords(List<CodingRecord> records) {
this.records = records;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_student_record, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
CodingRecord record = records.get(position);
holder.bind(record);
}
@Override
public int getItemCount() {
return records.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
private TextView dateView, studentIdView, planningView, devView, reportView, totalView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
dateView = itemView.findViewById(R.id.dateView);
studentIdView = itemView.findViewById(R.id.studentIdView);
planningView = itemView.findViewById(R.id.planningView);
devView = itemView.findViewById(R.id.devView);
reportView = itemView.findViewById(R.id.reportView);
totalView = itemView.findViewById(R.id.totalView);
}
public void bind(CodingRecord record) {
dateView.setText(record.getDate());
studentIdView.setText(record.getUserId());
planningView.setText(String.valueOf(record.getPlanningTime()));
int devTime = record.getCodingTime() + record.getDesignTime() + record.getTestTime();
int reportTime = record.getSizeMeasurementTime() + record.getPostmortemTime();
devView.setText(String.valueOf(devTime));
reportView.setText(String.valueOf(reportTime));
totalView.setText(String.valueOf(record.getTotalTime()));
}
}
}package com.example.blogapp.activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blogapp.ApiService;
import com.example.blogapp.R;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.model.CodingRecord;
import com.example.blogapp.network.RetrofitClient;
import java.util.List;
import java.util.Map;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class StudentStatsActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private StatsAdapter adapter; // 改为使用StatsAdapter
private ApiService apiService;
private TextView totalStatsView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_student_stats);
recyclerView = findViewById(R.id.recyclerView);
totalStatsView = findViewById(R.id.totalStatsView);
Button backButton = findViewById(R.id.backButton);
// 初始化RecyclerView
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new StatsAdapter(); // 使用StatsAdapter
recyclerView.setAdapter(adapter);
// 初始化Retrofit
apiService = RetrofitClient.getClient("http://192.168.20.105:8080/")
.create(ApiService.class);
// 加载数据
loadStudentStats();
backButton.setOnClickListener(v -> finish());
}
private void loadStudentStats() {
apiService.getStudentCodingRecords(null)
.enqueue(new Callback<ApiResponse<List<CodingRecord>>>() {
@Override
public void onResponse(Call<ApiResponse<List<CodingRecord>>> call,
Response<ApiResponse<List<CodingRecord>>> response) {
if(response.isSuccessful() && response.body() != null) {
List<CodingRecord> records = response.body().getData();
updateRecordsList(records);
displayTotalStats(records);
}
}
@Override
public void onFailure(Call<ApiResponse<List<CodingRecord>>> call, Throwable t) {
Toast.makeText(StudentStatsActivity.this, "加载失败", Toast.LENGTH_SHORT).show();
}
});
}
private void updateRecordsList(List<CodingRecord> records) {
adapter.setRecords(records); // 调用StatsAdapter的setRecords方法
}
private void displayTotalStats(List<CodingRecord> records) {
int totalTime = 0;
int planningTotal = 0;
int devTotal = 0;
int reportTotal = 0;
for (CodingRecord record : records) {
totalTime += record.getTotalTime() != null ? record.getTotalTime() : 0;
planningTotal += record.getPlanningTime() != null ? record.getPlanningTime() : 0;
// 计算开发时间(编码+设计+测试)
int codingTime = record.getCodingTime() != null ? record.getCodingTime() : 0;
int designTime = record.getDesignTime() != null ? record.getDesignTime() : 0;
int testTime = record.getTestTime() != null ? record.getTestTime() : 0;
devTotal += codingTime + designTime + testTime;
// 计算报告时间(规模测量+事后分析)
int sizeTime = record.getSizeMeasurementTime() != null ? record.getSizeMeasurementTime() : 0;
int postmortemTime = record.getPostmortemTime() != null ? record.getPostmortemTime() : 0;
reportTotal += sizeTime + postmortemTime;
}
String statsText = String.format(
"总记录数: %d\n" +
"总编程时间: %d分钟\n" +
"计划时间: %d分钟\n" +
"开发时间: %d分钟\n" +
"报告时间: %d分钟",
records.size(), totalTime, planningTotal, devTotal, reportTotal);
totalStatsView.setText(statsText);
}
}package com.example.blogapp.activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Toast;
import java.util.List;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blogapp.R;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.model.DailySummary;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.utils.SecureStorage;
import java.sql.Date;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class SummaryActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private SummaryAdapter adapter;
private com.example.blogapp.ApiService apiService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_summary);
apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(com.example.blogapp.ApiService.class);
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new SummaryAdapter();
recyclerView.setAdapter(adapter);
loadSummaries();
findViewById(R.id.fab_add).setOnClickListener(v -> showAddDialog());
}
private void loadSummaries() {
String userId = SecureStorage.getUserId(this);
if (userId != null && !userId.isEmpty()) {
Long currentUserId = Long.parseLong(userId);
Call<ApiResponse<List<DailySummary>>> call = apiService.getSummaries(currentUserId);
call.enqueue(new Callback<ApiResponse<List<DailySummary>>>() {
@Override
public void onResponse(Call<ApiResponse<List<DailySummary>>> call,
Response<ApiResponse<List<DailySummary>>> response) {
if (response.isSuccessful() && response.body() != null) {
List<DailySummary> data = response.body().getData();
Log.d("SummaryActivity", "获取到数据: " + data.size() + "条");
if (data != null && !data.isEmpty()) {
adapter.setData(data);
} else {
Toast.makeText(SummaryActivity.this, "没有总结数据", Toast.LENGTH_SHORT).show();
}
} else {
Log.e("SummaryActivity", "响应不成功: " + response.code());
}
}
@Override
public void onFailure(Call<ApiResponse<List<DailySummary>>> call, Throwable t) {
Log.e("SummaryActivity", "加载失败", t);
Toast.makeText(SummaryActivity.this, "加载失败: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
private void addSummary(DailySummary summary) {
// 从本地存储中获取当前用户 ID
String userId = SecureStorage.getUserId(this);
if (userId != null && !userId.isEmpty()) {
Long currentUserId = Long.parseLong(userId);
summary.setUserId(currentUserId);
Call<ApiResponse<Void>> call = apiService.addSummary(summary);
call.enqueue(new Callback<ApiResponse<Void>>() {
@Override
public void onResponse(Call<ApiResponse<Void>> call, Response<ApiResponse<Void>> response) {
if (response.isSuccessful()) {
loadSummaries();
Toast.makeText(SummaryActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ApiResponse<Void>> call, Throwable t) {
Toast.makeText(SummaryActivity.this, "添加失败", Toast.LENGTH_SHORT).show();
}
});
} else {
Toast.makeText(this, "用户信息未找到,请重新登录", Toast.LENGTH_SHORT).show();
startActivity(new Intent(this, LoginActivity.class));
finish();
}
}
private void showAddDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
View view = LayoutInflater.from(this).inflate(R.layout.dialog_add_summary, null);
EditText etUrl = view.findViewById(R.id.et_url);
DatePicker datePicker = view.findViewById(R.id.date_picker);
builder.setView(view)
.setPositiveButton("提交", (dialog, which) -> {
String url = etUrl.getText().toString();
int year = datePicker.getYear();
int month = datePicker.getMonth() + 1;
int day = datePicker.getDayOfMonth();
String date = String.format("%04d-%02d-%02d", year, month, day);
DailySummary summary = new DailySummary();
summary.setBlogUrl(url);
summary.setSummaryDate(Date.valueOf(date));
addSummary(summary);
})
.setNegativeButton("取消", null)
.show();
}
}package com.example.blogapp.activity;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blogapp.R;
import com.example.blogapp.model.DailySummary;
import java.util.ArrayList;
import java.util.List;
public class SummaryAdapter extends RecyclerView.Adapter<SummaryAdapter.SummaryViewHolder> {
private List
public void setData(List<DailySummary> summaries) {
this.summaries = summaries;
notifyDataSetChanged();
Log.d("SummaryAdapter", "数据更新,数量: " + summaries.size()); // 添加日志
}
@Override
public void onBindViewHolder(@NonNull SummaryViewHolder holder, int position) {
DailySummary summary = summaries.get(position);
Log.d("SummaryAdapter", "绑定数据: " + summary.getBlogUrl()); // 添加日志
holder.bind(summary);
}
@NonNull
@Override
public SummaryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_summary, parent, false);
return new SummaryViewHolder(view);
}
@Override
public int getItemCount() {
return summaries == null ? 0 : summaries.size();
}
public static class SummaryViewHolder extends RecyclerView.ViewHolder {
private TextView urlTextView;
private TextView dateTextView;
public SummaryViewHolder(View itemView) {
super(itemView);
urlTextView = itemView.findViewById(R.id.url_text);
dateTextView = itemView.findViewById(R.id.date_text);
}
public void bind(DailySummary summary) {
urlTextView.setText(summary.getBlogUrl());
// 直接显示日期字符串,或者格式化显示
dateTextView.setText(summary.getSummaryDate().toString());
urlTextView.setOnClickListener(v -> {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(summary.getBlogUrl()));
v.getContext().startActivity(intent);
});
}
}
}package com.example.blogapp.activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blogapp.ApiService;
import com.example.blogapp.DailySummaryResponse;
import com.example.blogapp.R;
import com.example.blogapp.activity.DailySummaryAdapter;
import com.example.blogapp.model.ApiResponse;
import com.example.blogapp.model.DailySummary;
import com.example.blogapp.network.RetrofitClient;
import com.example.blogapp.utils.SecureStorage;
import com.google.android.material.datepicker.MaterialDatePicker;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class SummarySearchActivity extends AppCompatActivity {
private EditText startDateEditText;
private EditText endDateEditText;
private EditText keywordEditText;
private RecyclerView recyclerView;
private DailySummaryAdapter adapter;
// SummarySearchActivity.java
private List<DailySummaryResponse> summaryList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_summary_search);
// 初始化视图
startDateEditText = findViewById(R.id.startDateEditText);
endDateEditText = findViewById(R.id.endDateEditText);
keywordEditText = findViewById(R.id.keywordEditText);
Button searchButton = findViewById(R.id.searchButton);
recyclerView = findViewById(R.id.recyclerView);
// 设置RecyclerView
// 修改Adapter初始化
adapter = new DailySummaryAdapter(summaryList);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
// 设置日期选择器
setupDatePickers();
// 设置搜索按钮点击事件
searchButton.setOnClickListener(v -> searchSummaries());
// 默认加载最近一周的数据
loadDefaultData();
}
private void setupDatePickers() {
MaterialDatePicker<Long> startDatePicker = MaterialDatePicker.Builder.datePicker()
.setTitleText("选择开始日期")
.build();
MaterialDatePicker<Long> endDatePicker = MaterialDatePicker.Builder.datePicker()
.setTitleText("选择结束日期")
.build();
startDatePicker.addOnPositiveButtonClickListener(selection -> {
if (selection != null) {
String formattedDate = formatDate(selection);
startDateEditText.setText(formattedDate);
}
});
endDatePicker.addOnPositiveButtonClickListener(selection -> {
if (selection != null) {
String formattedDate = formatDate(selection);
endDateEditText.setText(formattedDate);
}
});
startDateEditText.setOnClickListener(v -> {
if (!isFinishing() && !isDestroyed()) {
startDatePicker.show(getSupportFragmentManager(), "START_DATE_PICKER");
}
});
endDateEditText.setOnClickListener(v -> {
if (!isFinishing() && !isDestroyed()) {
endDatePicker.show(getSupportFragmentManager(), "END_DATE_PICKER");
}
});
}
private String formatDate(long timestamp) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
return sdf.format(new Date(timestamp));
}
private void loadDefaultData() {
// 默认加载最近一周的数据
searchSummaries();
}
private void searchSummaries() {
String startDate = startDateEditText.getText().toString();
String endDate = endDateEditText.getText().toString();
String keyword = keywordEditText.getText().toString();
ApiService apiService = RetrofitClient.getClient("http://192.168.20.105:8080/").create(ApiService.class);
Call<ApiResponse<List<DailySummaryResponse>>> call = apiService.searchSummaries(
startDate.isEmpty() ? null : startDate,
endDate.isEmpty() ? null : endDate,
keyword.isEmpty() ? null : keyword
);
call.enqueue(new Callback<ApiResponse<List<DailySummaryResponse>>>() {
@Override
public void onResponse(Call<ApiResponse<List<DailySummaryResponse>>> call,
Response<ApiResponse<List<DailySummaryResponse>>> response) {
if (response.isSuccessful() && response.body() != null && response.body().getData() != null) {
summaryList.clear();
summaryList.addAll(response.body().getData());
adapter.notifyDataSetChanged();
if (summaryList.isEmpty()) {
Toast.makeText(SummarySearchActivity.this,
"没有找到匹配的每日总结记录", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(SummarySearchActivity.this,
"获取数据失败", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ApiResponse<List<DailySummaryResponse>>> call, Throwable t) {
Toast.makeText(SummarySearchActivity.this,
"网络错误: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}package com.example.blogapp.activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blogapp.R;
import java.util.List;
import java.util.Map;
public class SummaryStatsAdapter extends RecyclerView.Adapter<SummaryStatsAdapter.ViewHolder> {
private List<Map<String, Object>> statsList;
public void setData(List<Map<String, Object>> statsList) {
this.statsList = statsList;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_summary_stats, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Map<String, Object> stat = statsList.get(position);
holder.classText.setText((String) stat.get("userClass"));
holder.idText.setText((String) stat.get("userId"));
holder.nameText.setText((String) stat.get("username"));
holder.countText.setText(String.valueOf(stat.get("summaryCount")));
}
@Override
public int getItemCount() {
return statsList == null ? 0 : statsList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView classText;
TextView idText;
TextView nameText;
TextView countText;
public ViewHolder(@NonNull View itemView) {
super(itemView);
classText = itemView.findViewById(R.id.classText);
idText = itemView.findViewById(R.id.idText);
nameText = itemView.findViewById(R.id.nameText);
countText = itemView.findViewById(R.id.countText);
}
}
}package com.example.blogapp.activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blogapp.R;
import java.util.List;
import java.util.Map;
public class SummaryStatsAdapter extends RecyclerView.Adapter<SummaryStatsAdapter.ViewHolder> {
private List<Map<String, Object>> statsList;
public void setData(List<Map<String, Object>> statsList) {
this.statsList = statsList;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_summary_stats, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Map<String, Object> stat = statsList.get(position);
holder.classText.setText((String) stat.get("userClass"));
holder.idText.setText((String) stat.get("userId"));
holder.nameText.setText((String) stat.get("username"));
holder.countText.setText(String.valueOf(stat.get("summaryCount")));
}
@Override
public int getItemCount() {
return statsList == null ? 0 : statsList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView classText;
TextView idText;
TextView nameText;
TextView countText;
public ViewHolder(@NonNull View itemView) {
super(itemView);
classText = itemView.findViewById(R.id.classText);
idText = itemView.findViewById(R.id.idText);
nameText = itemView.findViewById(R.id.nameText);
countText = itemView.findViewById(R.id.countText);
}
}
}package com.example.blogapp.activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.blogapp.R;
import java.util.List;
import java.util.Map;
public class SummaryStatsAdapter extends RecyclerView.Adapter<SummaryStatsAdapter.ViewHolder> {
private List<Map<String, Object>> statsList;
public void setData(List<Map<String, Object>> statsList) {
this.statsList = statsList;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_summary_stats, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Map<String, Object> stat = statsList.get(position);
holder.classText.setText((String) stat.get("userClass"));
holder.idText.setText((String) stat.get("userId"));
holder.nameText.setText((String) stat.get("username"));
holder.countText.setText(String.valueOf(stat.get("summaryCount")));
}
@Override
public int getItemCount() {
return statsList == null ? 0 : statsList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView classText;
TextView idText;
TextView nameText;
TextView countText;
public ViewHolder(@NonNull View itemView) {
super(itemView);
classText = itemView.findViewById(R.id.classText);
idText = itemView.findViewById(R.id.idText);
nameText = itemView.findViewById(R.id.nameText);
countText = itemView.findViewById(R.id.countText);
}
}
}

浙公网安备 33010602011771号