我想在RecyclerView上实时更改数据

问题描述

我正在尝试在RecyclerView中每1秒刷新一次,但我不知道如何使用API​​进行刷新,当我的api中发生更改时,我想在RecylerView中进行更改,以免刷卡还是我想每1秒刷一次刷卡器..所以这是我的代码

public class informationNow extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {
    private RequestQueue requestQueue;
    private SwipeRefreshLayout refresh;
    private ArrayList<TrashCanModel> trashCanModels = new ArrayList<>();
    private JsonArrayRequest arrayRequest;
    private Dialog dialog;
    private RecyclerView recyclerView;
    private  informationNowAdapter informationNowAdapter ;
    private String url = "http://192.168.1.34:9090/TrashCanData/lastrow";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_information_Now);
        refresh = (SwipeRefreshLayout) findViewById(R.id.Swiper);
        recyclerView = (RecyclerView) findViewById(R.id.Now);

        dialog = new Dialog(this);


        refresh.setonRefreshListener(this);
        refresh.post(new Runnable() {
            @Override
            public void run() {
                trashCanModels.clear();
                getData();
            }
        });


    }

    private void getData() {
        refresh.setRefreshing(true);

        arrayRequest = new JsonArrayRequest(url,new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                JSONObject jsonObject = null;
                for (int i = 0; i < response.length(); i++) {
                    try {
                        //JSONArray jsonArray = response.getJSONArray("users");
                        jsonObject = response.getJSONObject(i);
                        TrashCanModel cat = new TrashCanModel();
                        cat.setdistance(jsonObject.getInt("distance"));
                        cat.setTemperature(jsonObject.getInt("temperature"));
                        cat.setHumidity(jsonObject.getInt("humidity"));
                        Log.e("*********",cat.getdistance().toString());
                        Log.e("*********",cat.getTemperature().toString());
                        Log.e("*********",cat.getHumidity().toString());

                        trashCanModels.add(cat);
                    } catch (JSONException e) {
                        e.printstacktrace();

                    }
                }
                adapterPush(trashCanModels);
                refresh.setRefreshing(false);
            }
        },new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });

        requestQueue = Volley.newRequestQueue(informationNow.this);
        requestQueue.add(arrayRequest);
    }

    private void adapterPush(ArrayList<TrashCanModel> trashCanModels) {

        informationNowAdapter = new informationNowAdapter(this,trashCanModels);
        recyclerView.setLayoutManager(new linearlayoutmanager(this));

        recyclerView.setAdapter(informationNowAdapter);

    }
 
    @Override
    public void onRefresh() {
        trashCanModels.clear();
        getData();

    }

}

和我的适配器:

public class informationNowAdapter extends RecyclerView.Adapter<informationNowAdapter.MyViewHolder>{


    private Context context ;
    private ArrayList<TrashCanModel> trashCanModels;
    private String url = "";
//


    public informationNowAdapter (Context context,ArrayList<TrashCanModel> trashCanModels) {
        this.context = context;
        this.trashCanModels=trashCanModels;
    }




    @NonNull
    @Override
    public informationNowAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
        View view ;

        LayoutInflater layoutInflater = LayoutInflater.from(context);
        view = layoutInflater.inflate(R.layout.trashcan_list,parent,false);
        return new informationNowAdapter.MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull informationNowAdapter.MyViewHolder holder,int position) {
        //holder.id.setText("#"+String.valueOf(position+1));
        holder.distance.setText(trashCanModels.get(position).getdistance().toString());
        holder.temperature.setText(trashCanModels.get(position).getTemperature().toString());
        holder.humidity.setText(trashCanModels.get(position).getHumidity().toString());

    }

    @Override
    public int getItemCount() {
        return trashCanModels.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView  distance,temperature,humidity ;


        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            distance = (TextView) itemView.findViewById(R.id.distance);
            temperature = (TextView) itemView.findViewById(R.id.temperature);
            humidity = (TextView) itemView.findViewById(R.id.humidity);
//
        }
    }

}

那么我如何每1秒刷新一次数据!

解决方法

您可以使用Timer来完成

Timer repeatTask = new Timer();
        repeatTask.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                trashCanModels.clear();
                getData();
            }
        },1000);

要停止时致电repeatTask.cancel() 但是我认为您应该在更改api时使用推送通知,或者改用firebase或socket.io

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...