как мне сделать так, чтобы данные, которые я ввожу в EditText, вставлялись в базу данных и отображались в recyclerview, не обновляя их, как ajax?

#java #android

#java #Android

Вопрос:

Я пытался использовать adapter.notifyDataSetChanged() , но потерпел неудачу, может быть, кто-нибудь может сказать мне, где был размещен код.

Это мой MainActivity:

 private RecyclerView mList;
    private LinearLayoutManager linearLayoutManager;
    private DividerItemDecoration dividerItemDecoration;
    private Adapter mExampleAdapter;
    private ArrayList<Model> mExampleList;
    private RecyclerView.Adapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        modelList = new ArrayList<>();
        pesan= (EditText) findViewById(R.id.pesan);
        user= 1;
        admin= 1;
        save = (ImageButton) findViewById(R.id.btn_submit);
        mList = findViewById(R.id.main_list);
        modelList = new ArrayList<>();
        adapter = new Adapter(getApplicationContext(),modelList);

        linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        dividerItemDecoration = new DividerItemDecoration(mList.getContext(), linearLayoutManager.getOrientation());

        mList.setHasFixedSize(true);
        mList.setLayoutManager(linearLayoutManager);

        mList.setAdapter(adapter);

        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String isi_pesan = pesan.getText().toString();
                final String id_admin = admin.toString();
                final String id_user = user.toString();

                RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
                StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        pesan.setText("");

                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                        Toast.makeText(MainActivity.this, "my error :" error, Toast.LENGTH_LONG).show();
                        Log.i("My error","" error);
                    }
                }){
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {

                        Map<String,String> map = new HashMap<String, String>();
                        map.put("message",isi_pesan);
                        map.put("id_admin",id_admin);
                        map.put("id_user",id_user);
                        return map;
                    }
                };
                queue.add(request);


            }
        });

        getData();
    }


    private void getData() {
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Loading...");
        progressDialog.show();

        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                for (int i = 0; i < response.length(); i  ) {
                    try {
                        JSONObject jsonObject = response.getJSONObject(i);

                        Model model = new Model();
                        model.setPesan(jsonObject.getString("isi_pesan"));
                        model.setAdmin(jsonObject.getString("sender"));

                        modelList.add(model);
                        adapter.notifyDataSetChanged();
                        mExampleAdapter = new Adapter(MainActivity.this, modelList);
                        mList.setAdapter(mExampleAdapter);

                    } catch (JSONException e) {
                        e.printStackTrace();
                        progressDialog.dismiss();
                    }
                }

                progressDialog.dismiss();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Volley", error.toString());
                progressDialog.dismiss();
            }
        });
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(jsonArrayRequest);
    }

}
  

Я хочу, чтобы данные, которые я публикую, отображались в режиме реального времени, например whatsapp

Ответ №1:

Сначала вы сказали recyclerveiw, что количество элементов фиксировано mList.setHasFixedSize(true); , но в методе getData вы добавили к нему элемент.

во-вторых, не вызывайте adapter.notifyDataSetChanged(); , когда вы только что добавили элемент, вместо этого вызывайте notifyItemInserted(position);

в-третьих, вы заменили адаптер после вызова adapter.notifyDataSetChanged(); , сначала замените адаптер, а затем вызовите adapter.notifyDataSetChanged();