Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用单击侦听器和后台工作程序更改android视图的外观?_Android - Fatal编程技术网

如何使用单击侦听器和后台工作程序更改android视图的外观?

如何使用单击侦听器和后台工作程序更改android视图的外观?,android,Android,我有一个android应用程序,用户可以使用它在特定时间查看课程。他们的每日日程以一系列卡片视图的形式显示在RecyclerView上。每个CardView都有每个班级的基本信息,包括讲师姓名、课程名称、出勤状态等。。 该应用程序通过一个php脚本与MySQL数据库通信,该脚本由AsyncTask后台工作程序调用。在PostExecute方法中,应用程序从php脚本接收一个结果(如果准时签入,则“Present”,如果迟到,则“Tardy”,如果完全错过,则“缺席”),并显示在AlertDial

我有一个android应用程序,用户可以使用它在特定时间查看课程。他们的每日日程以一系列卡片视图的形式显示在RecyclerView上。每个CardView都有每个班级的基本信息,包括讲师姓名、课程名称、出勤状态等。。 该应用程序通过一个php脚本与MySQL数据库通信,该脚本由AsyncTask后台工作程序调用。在PostExecute方法中,应用程序从php脚本接收一个结果(如果准时签入,则“Present”,如果迟到,则“Tardy”,如果完全错过,则“缺席”),并显示在AlertDialog中。PostExecute方法还设置一个字符串变量,使其等于结果

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结果保存在一个变量中,然后单击按钮访问它。 那么,这里基本上发生了什么:

  • 你点击一个按钮
  • 您可以启动异步任务
  • 您的异步任务仍在工作。所以,onTime仍然没有字符串。而且,甚至在asynctask生成结果并将其保存到onTime之前,status.setText()就被调用了
  • 您的asynctask已完成其作业并将结果保存在onTime中,但按钮已完成其剩余代码,因此textview不会获得最新更改
  • 你再次点击按钮
  • 您的asynctask再次开始工作,但这次onTime有一个值,因为之前的asynctask将其结果保存在其中。因此,当调用status.setText()时,它将设置onTime的值(它保存来自上一个异步任务的结果)
  • 因此,要解决这个问题,您不应该在单击按钮时更新textview,而应该在asynctask的onPostExecute()中更新它们

    只需像这样更改onPostExecute()您就有了解决方案

    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