Как обновить sh recyclerView после изменения данных - PullRequest
0 голосов
/ 25 апреля 2020

Я работаю над созданием приложения, которое содержит (displaylerView) ответы участника дисплея. У меня проблема после того, как участник публикует новый комментарий (recyclerView) не обновляется в реальном времени. Как я могу обновить данные (recyclerView) после ввода новых данных, когда пользователь не закрывает или не закрывает приложение؟


public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{

    private List<List_Data>list_data;

    public MyAdapter(List<List_Data> list_data) {
        this.list_data = list_data;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.list_data,parent,false);
        return new ViewHolder(view);

    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        List_Data listData=list_data.get(position);
        holder.txtname.setText(listData.gettext());
        holder.txtmovie.setText(listData.getmovie_id());

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{
        private TextView txtname,txtmovie,ImageView;
        public ViewHolder(View itemView) {
            super(itemView);
            txtname=(TextView)itemView.findViewById(R.id.txt_name);
            txtmovie=(TextView)itemView.findViewById(R.id.txt_moviename);
        }
    }

}


public class StatusFragment extends Fragment {


    Button btn_send_comment;
    EditText ETXT_comment;
String id;
    private List<List_Data> list;
    private RecyclerView rvy;
    private MyAdapter adapter;
    ImageView  btn_add_comments;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        View rootView = inflater.inflate(R.layout.status, container, false);
        ETXT_comment = (EditText)rootView.findViewById(R.id.ETXT_comment);
        btn_add_comments = (ImageView) rootView.findViewById(R.id.btn_add_comments);
        btn_send_comment = (Button) rootView.findViewById(R.id.btn_send_comment);
        Intent i = getActivity().getIntent();
        final String movie_id = i.getStringExtra("id");
        rvy=(RecyclerView)rootView.findViewById(R.id.recyclerview);
        rvy.setHasFixedSize(true);
        rvy.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));
        list=new ArrayList<>();
        adapter=new MyAdapter(list);
        getComment(movie_id);

//----------------Send Commant
        btn_send_comment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final String comment_text = ETXT_comment.getText().toString().trim();
                if (comment_text.equals("")) {
                } else {
                   //
                    final String REGISTER_URL = "http://0000000/Comment.php";
                    StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
                            new Response.Listener<String>() {

                                @Override
                                public void onResponse(String response) {
                               //  getComment(movie_id);
                                }
                            },
                            new Response.ErrorListener() {
                                @Override
                                public void onErrorResponse(VolleyError error) {
                                    Toast.makeText(getActivity().getApplicationContext(), error.toString(), Toast.LENGTH_LONG).show();
                                }
                            }) {
                        @Override
                        protected Map<String, String> getParams() {
                            Map<String, String> params = new HashMap<String, String>();
                            params.put("id", id);
                            params.put("comment", comment_text);

                            return params;
                        }
                    };
                    RequestQueue requestQueue = (RequestQueue) Volley.newRequestQueue(getActivity().getApplicationContext());
                    requestQueue.add(stringRequest);
                }
            }





        });
//--------------------
        return rootView;

    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

    }

private void getComment(String id){
    final String HI ="http://0000000/Cm.php?id=" + id ;
    StringRequest stringRequest=new StringRequest(Request.Method.GET, HI, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {

                JSONObject jsonObject=new JSONObject(response);
                JSONArray array=jsonObject.getJSONArray("info");

                for (int i=0; i<array.length(); i++ ){
                    JSONObject ob=array.getJSONObject(i);
                    List_Data listD=new List_Data(ob.getString("comment")
                            ,ob.getString("name"));
                    list.add(listD);
                  //  adapter.notifyItemRangeChanged(0, list_data.size());
                   // rv.removeAllViews();

                }
                rvy.setAdapter(adapter);

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

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

        }
    });
    RequestQueue requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
    requestQueue.add(stringRequest);


}

}


Также, когда я ставлю getComment (movie_id); в onResponse это работает, но есть и другая проблема - показ данных повторяется дважды для каждого комментария пользователя.

Ответы [ 3 ]

1 голос
/ 25 апреля 2020
  • Перемещение rvy.setAdapter(adapter) из getComment() в onViewCreated()
  • Очистите список в начале вашего getComment() метода, добавьте эту строку:

    list.clear ()

В своем коде вы добавили те же элементы к этому экземпляру List при вызове .add (), следовательно, появляются повторяющиеся элементы .

  • После list.add (listD) вызовите adapter.notifyDataSetChanged ()
1 голос
/ 25 апреля 2020

Когда вы возвращаете новый комментарий, вы не добавили список адаптеров RecyclerView с новым комментарием. Вы только что обновили список фрагментов новым комментарием, и адаптер не имеет представления об этом обновлении списка.

Итак, измените свой адаптер, чтобы он принимал новый метод комментария, и обновите список только новым вставьте строку, используя notifyItemInserted():

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{

    private List<List_Data>list_data;

    public MyAdapter(List<List_Data> list_data) {
        this.list_data = list_data;
    }

    public addComment(List_Data comment) {
        this.list_data.add(comment);
        notifyItemInserted(list_data.size() - 1); // Updating adapter list
    }

    // ...  rest of code
}

И в вашем getComment() используйте новый метод добавленного адаптера, когда вы получите ответ. Обратите внимание на изменение в // <<<<<<<<<<<<<<<< Updating adapter list

private void getComment(String id){
    final String HI ="http://0000000/Cm.php?id=" + id ;
    StringRequest stringRequest=new StringRequest(Request.Method.GET, HI, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {

                JSONObject jsonObject=new JSONObject(response);
                JSONArray array=jsonObject.getJSONArray("info");

                for (int i=0; i<array.length(); i++ ){
                    JSONObject ob=array.getJSONObject(i);
                    List_Data listD = new List_Data(ob.getString("comment")
                            ,ob.getString("name"));
                    list.add(listD);
                    adapter.addComment(listD); // <<<<<<<<<<<<<<<< Updating adapter list

                   // rv.removeAllViews();

                }
                rvy.setAdapter(adapter);

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

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

        }
    });
    RequestQueue requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
    requestQueue.add(stringRequest);


}

, наконец, не забудьте раскомментировать использование getComment() в прослушивателе кнопки btn_send_comment.

1 голос
/ 25 апреля 2020

Вы пытались добавить новый комментарий в свой список, а затем вызвали утверждение

adapter.notifyDataSetChanged()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...