简体   繁体   English

如何在同一个 recyclerview 的适配器类中更新 recyclerview?

[英]How can I update recyclerview inside the adapter class of the same recyclerview?

I have a recyclerview.我有一个回收站。 I want to update the recycler view from its adapter class.我想从其适配器类更新回收器视图。 I tried notiftDataSetChanged( ) but it only works from the main class.我试过notiftDataSetChanged( )但它只能在主类中工作。 Below is the code for the recyclerview adapter class.下面是 recyclerview 适配器类的代码。

package com.library.apple.food;

import android.content.Context;
import android.content.Intent;


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

private Context context;
private List<CartItem> list;
private String auth_token;
private RecyclerView recyclerView;

public CartAdapter(Context context, List<CartItem> list, String 
auth_token, RecyclerView recyclerView){
    this.context = context;
    this.list = list;
    this.auth_token = auth_token;
    this.recyclerView = recyclerView;


}



@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, 
int i) {
View view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.row_cart,viewGroup,false);
    CartAdapter.MyViewHolder myViewHolder = new 
    CartAdapter.MyViewHolder(view);
    return myViewHolder;
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder viewHolder, 
final int i) {

    final CartItem item = list.get(i);

    viewHolder.title_cart.setText(item.getTitle_cart());
    viewHolder.no_cart.setText(item.getNo_cart());

    String price1 = context.getString(R.string.price,item.getPrice_cart());

    viewHolder.price_cart.setText(price1);


    String veg = item.getVegnon_cart();
    if (veg.equalsIgnoreCase("false")) {
        viewHolder.vegnon_cart.setImageResource(R.drawable.non_veg);

    }


    //-----------------------------------------------------------------------------


    //cart plus button
    viewHolder.btn_plus_cart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View view) {

            String url_plus = "https://www.hungermela.com/api/v1/change-quantity/";
            final String item_id = item.getCart_item_id();


            RequestQueue queue = Volley.newRequestQueue(context);

            StringRequest postRequest = new StringRequest(Request.Method.POST, url_plus,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            // response
                            Log.d("Response", response);

//HERE I WANT TO UPDATE MY RECYCLERVIEW




                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            // error
                            Log.d("Error.Response", error.toString());

                        }
                    }
            ) {


                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> params = new HashMap<String, String>();

                    params.put("Authorization", "Token "+auth_token);
                    return params;
                }


                @Override
                protected Map<String, String> getParams() {
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("pk", item_id);

                    int quantity = Integer.parseInt(item.getNo_cart());
                    String quan = String.valueOf(quantity+1);
                    params.put("quantity",quan);

                    return params;
                }
            };
            queue.add(postRequest);




        }
    });
    //cart plus ends here


    //-----------------------------------------------------------------------------


    //cart minus button
    viewHolder.btn_minus_cart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View view) {

            int quantity = Integer.parseInt(item.getNo_cart());



            if(quantity==1){



                String url_minus = "https://www.hungermela.com/api/v1/delete-item/";
                final String item_id = item.getCart_item_id();



                RequestQueue queue = Volley.newRequestQueue(context);

                StringRequest postRequest = new StringRequest(Request.Method.POST, url_minus,
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String response) {
                                // response
                                Log.d("Response", response);



                            AppCompatActivity activity = (AppCompatActivity) view.getContext();
                            Fragment myFragment = new CartFragment();

                            activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();




                                notifyDataSetChanged();

                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                // error
                                Log.d("Error.Response", error.toString());

                            }
                        }
                ) {


                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        Map<String, String> params = new HashMap<String, String>();

                        params.put("Authorization", "Token "+auth_token);
                        return params;
                    }


                    @Override
                    protected Map<String, String> getParams() {
                        Map<String, String> params = new HashMap<String, String>();
                        params.put("pk", item.getId_id());



                        return params;
                    }
                };
                queue.add(postRequest);





            }



            else if(quantity > 1){


                String url_minus = "https://www.hungermela.com/api/v1/change-quantity/";
                final String item_id = item.getCart_item_id();



                RequestQueue queue = Volley.newRequestQueue(context);

                StringRequest postRequest = new StringRequest(Request.Method.POST, url_minus,
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String response) {
                                // response
                                Log.d("Response", response);

                            AppCompatActivity activity = (AppCompatActivity) view.getContext();
                            Fragment myFragment = new CartFragment();

                            activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();




                                notifyDataSetChanged();

                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                // error
                                Log.d("Error.Response", error.toString());

                            }
                        }
                ) {


                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        Map<String, String> params = new HashMap<String, String>();

                        params.put("Authorization", "Token "+auth_token);
                        return params;
                    }


                    @Override
                    protected Map<String, String> getParams() {
                        Map<String, String> params = new HashMap<String, String>();
                        params.put("pk", item_id);

                        int quantity = Integer.parseInt(item.getNo_cart());
                        String quan = String.valueOf(quantity-1);
                        params.put("quantity",quan);


                        return params;
                    }
                };
                queue.add(postRequest);



            }





        }
    });
    //cart minus ends here


    //-----------------------------------------------------------------------------




}

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

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView title_cart, no_cart, price_cart;
    ImageView vegnon_cart;
    Button btn_minus_cart, btn_plus_cart;

    public MyViewHolder(@NonNull View itemView) {
        super(itemView);

        vegnon_cart = (ImageView)itemView.findViewById(R.id.vegnon_cart);
        title_cart = (TextView)itemView.findViewById(R.id.title_cart);
        no_cart = (TextView)itemView.findViewById(R.id.no_cart);
        price_cart = (TextView)itemView.findViewById(R.id.price_cart);

        //Button
        btn_minus_cart = (Button) itemView.findViewById(R.id.btn_minus_cart);
        btn_plus_cart = (Button) itemView.findViewById(R.id.btn_plus_cart);
    }

    @Override
    public void onClick(View view) {

    }
}
}

I have tried using notiftDataSetChanged( ) but it didn't work.我曾尝试使用 notiftDataSetChanged() 但它没有用。 It didn't updates the recyclerview at runtime.它没有在运行时更新 recyclerview。 I have to again refresh the page.我必须再次刷新页面。 I want to update the recyclerview just after the plus button in my recyclerview row is clicked.我想在单击我的 recyclerview 行中的加号按钮后更新 recyclerview。

The problem is probably you didn't update carditem list when you click plus or minus button.For example,问题可能是您单击加号或减号按钮时没有更新carditem列表。例如,

final CartItem item = list.get(i);
viewHolder.btn_plus_cart.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(final View view) {
        int count = item.getNo_cart()+1; //may be you can use response from network
        item.setNo_cart(count); //update item
        notifyDataSetChanged();
    }
}

You need to update carditem object with new data before calling notifyDataSetChanged()在调用 notifyDataSetChanged() 之前,您需要使用新数据更新 carditem 对象

You can make something like that你可以做这样的事情

public void updateData( List<CartItem> newData)

 {
     list.clear();
     list.addAll(newData);
     this.notiftDataSetChanged( );

 }

Or use set function to update only one item或者使用set函数只更新一项

 public void updateOnlyOneItem(CartItem newItem,int position){
     this.list.set(position, newItem);
     this.notifyItemChanged();
 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM