日报2025410
个人作业开发
package com.example.dailyreport.adapter;
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.dailyreport.R;
import com.example.dailyreport.model.DailyLog;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
public class DailyLogAdapter extends RecyclerView.Adapter<DailyLogAdapter.ViewHolder> {
private final List<DailyLog> dailyLogList;
private final OnDailyLogClickListener onDailyLogClickListener;
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
public interface OnDailyLogClickListener {
void onDailyLogClick(DailyLog dailyLog);
}
public DailyLogAdapter(List<DailyLog> dailyLogList, OnDailyLogClickListener listener) {
this.dailyLogList = dailyLogList;
this.onDailyLogClickListener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_daily_log, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
DailyLog dailyLog = dailyLogList.get(position);
String dateStr = dailyLog.getDate() != null ? dateFormat.format(dailyLog.getDate()) : "未知日期";
holder.tvDate.setText(dateStr);
String analysis = dailyLog.getDevelopmentAnalysis();
holder.tvAnalysis.setText(analysis != null && !analysis.isEmpty() ? analysis : "无分析内容");
Double hours = dailyLog.getTotalHours();
holder.tvHours.setText(hours != null ? hours + "小时" : "未记录时间");
holder.itemView.setOnClickListener(v -> onDailyLogClickListener.onDailyLogClick(dailyLog));
}
@Override
public int getItemCount() {
return dailyLogList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
final TextView tvDate;
final TextView tvAnalysis;
final TextView tvHours;
public ViewHolder(View itemView) {
super(itemView);
tvDate = itemView.findViewById(R.id.tvDate);
tvAnalysis = itemView.findViewById(R.id.tvAnalysis);
tvHours = itemView.findViewById(R.id.tvHours);
}
}
}
package com.example.dailyreport.adapter;
import static android.widget.Toast.LENGTH_LONG;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.dailyreport.R;
import com.example.dailyreport.model.Blog;
import com.example.dailyreport.model.User;
import com.example.dailyreport.network.ApiResponse;
import com.example.dailyreport.network.RetrofitClient;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class UserListAdapter extends RecyclerView.Adapter<UserListAdapter.ViewHolder> {
private List<User> userList;
private OnItemClickListener listener;
public interface OnItemClickListener {
void onItemClick(User user);
}
public UserListAdapter(List<User> userList, OnItemClickListener listener) {
this.userList = userList;
this.listener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_student, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
User user = userList.get(position);
holder.tvId.setText("学号: " + user.getId());
holder.tvName.setText("姓名: " + user.getName());
holder.tvClass.setText("班级: " + user.getSclass());
// 加载博客数量
loadBlogCount(user.getId(), holder.tvBlogCount);
holder.itemView.setOnClickListener(v -> listener.onItemClick(user));
}
private void loadBlogCount(String userId, TextView tvBlogCount) {
RetrofitClient.getInstance().getApiService()
.selectByUserId(userId)
.enqueue(new Callback<ApiResponse<List<Blog>>>() {
@Override
public void onResponse(Call<ApiResponse<List<Blog>>> call, Response<ApiResponse<List<Blog>>> response) {
try {
if (response.isSuccessful() && response.body() != null) {
ApiResponse<List<Blog>> apiResponse = response.body();
if (apiResponse != null) {
List<Blog> blogs = apiResponse.getData();
int count = blogs != null ? blogs.size() : 0;
tvBlogCount.setText("博客数量: " + count);
// 打印响应数据,用于调试
System.out.println("API响应数据: " + apiResponse.toString());
} else {
tvBlogCount.setText("博客数量: 数据为空");
System.out.println("API响应体为空");
}
} else {
tvBlogCount.setText("博客数量: 请求失败");
System.out.println("API请求失败: " + response.code());
}
} catch (Exception e) {
e.printStackTrace();
tvBlogCount.setText("博客数量: 处理异常");
System.out.println("数据处理异常: " + e.getMessage());
}
}
@Override
public void onFailure(Call<ApiResponse<List<Blog>>> call, Throwable t) {
t.printStackTrace();
String errorMessage = "网络错误";
if (t instanceof java.net.UnknownHostException) {
errorMessage = "网络不可用";
} else if (t instanceof java.net.SocketTimeoutException) {
errorMessage = "请求超时";
} else if (t instanceof java.net.ConnectException) {
errorMessage = "连接失败";
}
tvBlogCount.setText("博客数量: " + errorMessage);
System.out.println("加载失败: " + t.getMessage());
}
});
}
@Override
public int getItemCount() {
return userList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView tvId, tvName, tvClass, tvBlogCount;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tvId = itemView.findViewById(R.id.tvId);
tvName = itemView.findViewById(R.id.tvName);
tvClass = itemView.findViewById(R.id.tvClass);
tvBlogCount = itemView.findViewById(R.id.tvBlogCount);
}
}
}
package com.example.dailyreport.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.dailyreport.R;
import com.example.dailyreport.model.WeeklyPlan;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
public class WeeklyPlanAdapter extends RecyclerView.Adapter<WeeklyPlanAdapter.ViewHolder> {
private List<WeeklyPlan> plans;
private OnDeleteClickListener deleteListener;
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault());
public interface OnDeleteClickListener {
void onDeleteClick(WeeklyPlan plan);
}
public WeeklyPlanAdapter(List<WeeklyPlan> plans, OnDeleteClickListener listener) {
this.plans = plans;
this.deleteListener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_weekly_plan, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
WeeklyPlan plan = plans.get(position);
// 添加日期空值检查
if (plan != null && plan.getDate() != null) {
try {
holder.tvDate.setText(dateFormat.format(plan.getDate()));
} catch (Exception e) {
holder.tvDate.setText("日期格式错误");
e.printStackTrace();
}
} else {
holder.tvDate.setText("无日期信息");
}
holder.tvPlan.setText(plan.getPlan());
holder.btnDelete.setOnClickListener(v -> deleteListener.onDeleteClick(plan));
}
@Override
public int getItemCount() {
return plans.size();
}
public void updatePlans(List<WeeklyPlan> newPlans) {
this.plans = newPlans;
notifyDataSetChanged();
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView tvDate, tvPlan;
Button btnDelete;
ViewHolder(View view) {
super(view);
tvDate = view.findViewById(R.id.tvDate);
tvPlan = view.findViewById(R.id.tvPlan);
btnDelete = view.findViewById(R.id.btnDelete);
}
}
}
package com.example.dailyreport.network;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import java.util.concurrent.TimeUnit;
public class RetrofitClient {
// 模拟器访问本地服务器
private static final String BASE_URL = "http://10.0.2.2:8080/";
// 真机访问需要改为实际IP(确保手机和PC在同一网络)
// private static final String BASE_URL = "http://192.168.x.x:8080/";
private static RetrofitClient instance;
private final ApiService apiService;
private Retrofit retrofit; // 添加这行声明
private RetrofitClient() {
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.connectTimeout(30, TimeUnit.SECONDS) // 添加超时设置
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.build();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client) // 使用带日志拦截器的client
.addConverterFactory(GsonConverterFactory.create())
.build();
apiService = retrofit.create(ApiService.class);
}
public static synchronized RetrofitClient getInstance() {
if (instance == null) {
instance = new RetrofitClient();
}
return instance;
}
public ApiService getApiService() {
return apiService;
}
}
package com.example.dailyreport.network;
import com.example.dailyreport.model.Blog;
import com.example.dailyreport.model.DailyLog;
import com.example.dailyreport.model.User;
import com.example.dailyreport.model.WeeklyPlan;
import java.util.List; // 添加这行导入
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE; // 添加这行导入
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;
public interface ApiService {
@POST("/user/login")
Call<ApiResponse<User>> login(@Body User user);
@POST("user/register")
Call<ApiResponse<User>> register(@Body User user);
@GET("blog/get/{id}")
Call<ApiResponse<Blog>> getBlog(@Path("id") String id);
@POST("blog/add")
Call<Void> addBlog(@Body Blog blog);
@GET("blog/all")
Call<List<Blog>> getAllBlogs();
@POST("blog/update")
Call<ApiResponse<Blog>> updateBlog(@Body Blog blog);
@GET("/user/id/{name}")
Call<ApiResponse<String>> getIdByName(@Path("name") String name);
@POST("/weeklyPlan/add")
Call<ApiResponse<String>> addWeeklyPlan(@Body WeeklyPlan weeklyPlan);
@GET("/weeklyPlan/list")
Call<ApiResponse<List<WeeklyPlan>>> getWeeklyPlans();
@DELETE("/weeklyPlan/delete/{id}")
Call<ApiResponse<String>> deleteWeeklyPlan(@Path("id") String id);
@POST("/dailyLog/add")
Call<ApiResponse<String>> addDailyLog(@Body DailyLog dailyLog);
// Add this method to your ApiService interface
@GET("blog/user/{userId}")
Call<ApiResponse<List<Blog>>> selectByUserId(@Path("userId") String userId);
// 在现有的ApiService接口中添加以下方法
@GET("dailyLog/user/{userId}")
Call<ApiResponse<List<DailyLog>>> getDailyLogsByUserId(@Path("userId") String userId);
@GET("dailyLog/get/{id}")
Call<ApiResponse<DailyLog>> getDailyLogById(@Path("id") String id);
@GET("/dailyLog/getByDate")
Call<ApiResponse<List<DailyLog>>> getDailyLogsByDate(@Query("date") String date);
@GET("/user/allStudents")
Call<ApiResponse<List<User>>> getAllStudents();
}

浙公网安备 33010602011771号