更改数据后如何刷新recyclerView

时间:2020-04-24 22:57:29

标签: android android-recyclerview

我正在开发包含(recyclerView)显示成员响应的应用程序。成员发布新评论后(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 个答案:

答案 0 :(得分:1)

您尝试将新评论添加到列表中,然后调用该语句

adapter.notifyDataSetChanged()

答案 1 :(得分:0)

  • rvy.setAdapter(adapter)getComment()移到onViewCreated()
  • getComment()方法的开头清除列表,添加以下行:

    list.clear()

在您的代码中,您在调用.add()时将相同的项附加到List的此实例,因此,出现重复的元素。

  • 在list.add(listD)之后,调用adapter.notifyDataSetChanged()

答案 2 :(得分:0)

返回新注释时,没有将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的用法。