如何使用单击侦听器和后台工作程序更改android视图的外观?
我有一个android应用程序,用户可以使用它在特定时间查看课程。他们的每日日程以一系列卡片视图的形式显示在RecyclerView上。每个CardView都有每个班级的基本信息,包括讲师姓名、课程名称、出勤状态等。。 该应用程序通过一个php脚本与MySQL数据库通信,该脚本由AsyncTask后台工作程序调用。在PostExecute方法中,应用程序从php脚本接收一个结果(如果准时签入,则“Present”,如果迟到,则“Tardy”,如果完全错过,则“缺席”),并显示在AlertDialog中。PostExecute方法还设置一个字符串变量,使其等于结果如何使用单击侦听器和后台工作程序更改android视图的外观?,android,Android,我有一个android应用程序,用户可以使用它在特定时间查看课程。他们的每日日程以一系列卡片视图的形式显示在RecyclerView上。每个CardView都有每个班级的基本信息,包括讲师姓名、课程名称、出勤状态等。。 该应用程序通过一个php脚本与MySQL数据库通信,该脚本由AsyncTask后台工作程序调用。在PostExecute方法中,应用程序从php脚本接收一个结果(如果准时签入,则“Present”,如果迟到,则“Tardy”,如果完全错过,则“缺席”),并显示在AlertDial
The background worker is called from a click listener like so:
baf.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int bright = status.getResources().getColor(R.color.colorPresent);
status.setBackgroundColor(bright);
lol = getAdapterPosition()+1;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Calendar c = Calendar.getInstance();
String time = sdf.format(c.getTime());
Log.d("Current Time",time);
String type="checkin";
PresentBackgroundWorker presentBackgroundWorker = new PresentBackgroundWorker(getActivity());
presentBackgroundWorker.execute(type,date,time, "t"+String.valueOf(lol));
String aaa = ontime;
status.setText(aaa);
}
});
变量ontime(全局变量)是php脚本的结果,其值由后台工作程序设置,如下所示:
protected void onPostExecute(String result) {
writeitout(result);
alertDialog.setMessage(result);
alertDialog.show();
}
private void writeitout(String string) {
ontime = string;
Log.d("STATS",ontime);
}
根据Log.d()
命令,ontime变量正在适当更改,但对“状态”文本视图的更改会延迟一次单击。也就是说,上一个课程的结果显示在当前课程中。如何确保ontime变量中的更改按时显示
编辑:添加了原始CourseApter
public class CourseAdapter extends RecyclerView.Adapter<CourseAdapter.MyViewHolder> {
private List<Course> courseList;
public CourseAdapter(List<Course> sc) { this.courseList = sc; }
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView title, teacher, type, status;
FloatingActionButton baf;
View subIten;
int lol;
public MyViewHolder(View view) {
super(view);
title = (TextView) view.findViewById(R.id.texttitle);
teacher = (TextView) view.findViewById(R.id.textteach);
type = (TextView) view.findViewById(R.id.texttype);
baf = (FloatingActionButton) view.findViewById(R.id.fab);
status = view.findViewById(R.id.textstatus);
subIten = (View) view.findViewById(R.id.sub_item);
}
private void bind(Course course) {
title.setText(course.getTitle());
teacher.setText(course.getTeacher());
type.setText(course.getType());
baf.setImageResource(course.getPhotoID());
baf.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int bright = status.getResources().getColor(R.color.colorPresent);
status.setBackgroundColor(bright);
lol = getAdapterPosition()+1;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Calendar c = Calendar.getInstance();
String time = sdf.format(c.getTime());
Log.d("Current Time",time);
String type="checkin";
PresentBackgroundWorker presentBackgroundWorker = new PresentBackgroundWorker(getActivity());
presentBackgroundWorker.execute(type,date,time, "t"+String.valueOf(lol));
}
});
}
}
@Override
public CourseAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.cardview, parent, false);
MyViewHolder viewHolder = new MyViewHolder(itemView);
return viewHolder;
}
@Override
public void onBindViewHolder(final CourseAdapter.MyViewHolder holder, final int position) {
final Course course = courseList.get(position);
holder.bind(course);
}
public int getItemCount() {
return courseList.size();
}
}
公共类CourseApter扩展了RecyclerView.Adapter{
私人名单课程专家;
公共coursedapter(List sc){this.courseList=sc;}
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
文本视图标题、教师、类型、状态;
浮动操作按钮baf;
视图子节点;
int-lol;
公共MyViewHolder(视图){
超级(视图);
title=(TextView)view.findViewById(R.id.texttitle);
教师=(TextView)view.findViewById(R.id.textteach);
type=(TextView)view.findViewById(R.id.texttype);
baf=(FloatingActionButton)view.findViewById(R.id.fab);
状态=view.findViewById(R.id.textstatus);
subIten=(视图)View.findViewById(R.id.sub_项);
}
私人无效绑定(课程){
title.setText(course.getTitle());
teacher.setText(course.getTeacher());
type.setText(course.getType());
baf.setImageResource(course.getPhotoID());
baf.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int-bright=status.getResources().getColor(R.color.colorPresent);
状态:挫折背景色(明亮);
lol=getAdapterPosition()+1;
SimpleDataFormat sdf=新的SimpleDataFormat(“HH:mm:ss”);
Calendar c=Calendar.getInstance();
字符串时间=sdf.format(c.getTime());
Log.d(“当前时间”,时间);
String type=“签入”;
PresentBackgroundWorker PresentBackgroundWorker=新PresentBackgroundWorker(getActivity());
presentBackgroundWorker.execute(类型、日期、时间,“t”+字符串.valueOf(lol));
}
});
}
}
@凌驾
public CourseAdapter.MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.cardview,父级,假);
MyViewHolder viewHolder=新的MyViewHolder(itemView);
返回视图持有者;
}
@凌驾
BindViewHolder上的公共无效(最终课程Adapter.MyViewHolder,最终int位置){
最终课程=课程列表获取(位置);
持有人。绑定(过程);
}
public int getItemCount(){
返回courseList.size();
}
}
问题在于您正在将asynctask结果保存在一个变量中,然后单击按钮访问它。
那么,这里基本上发生了什么:
protected void onPostExecute(String result) {
writeitout(result);
status.setText(result); //updating the textview directly here
alertDialog.setMessage(result);
alertDialog.show();
}
另外,从baf clickListener中删除这两行
String aaa = ontime;
status.setText(aaa);
不需要做太多Java,但是
status
来自哪里。这是否在onClick函数的范围内?status
是CardView中的文本视图,显示未真正回答我问题的考勤状态。我没有看到状态
被实例化或传递到函数中。例如,这是否有效<代码>Log.d(status.getText()),假设它有一些默认文本值。baf.setOnClickListener()
在RecyclerView.Viewholder
类中调用,其中实例化了status
,其默认值为“缺席”,因此您建议的log
命令运行良好,这是我唯一的猜测。有什么方法可以称视图为“刷新”或其他什么吗?祝你好运您的方法确实会在PostExecute上更改状态文本视图中的文本,但奇怪的是,它会在CardView中更改最后一门课程的状态,而不管我按哪个按钮,您想再解释一下吗?我希望我能帮助你@InigoMontoyaJrYes@ash12。在我以前的设置中,我使用了se