与回调接口访问凌空响应 [英] Accessing volley response with callback interfaces

查看:239
本文介绍了与回调接口访问凌空响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我米试图提取的Andr​​oid凌空响应同一类的成员变量。我用的回调接口来执行此任务:

 公共无效的getData(MyCustomListener customListener){JsonArrayRequest arrayRequest =新JsonArrayRequest(Request.Method.POST,网址,
      回应 - > {
              Log.i(回应,response.toString());
              customListener.onResponse(completeCart);              },
      错误 - > Log.i(Volley_error,error.getMessage())){
      ...

CustomerListener接口:

 公共接口MyCustomListener {    公共无效onResponse(对象响应);    公共无效onerror的(字符串error_response);
}

和里面的 onCreateView 片段的方法:

 的getData(新MyCustomListener(){
      @覆盖
      公共无效onResponse(对象响应){
        completeCartProItems.addAll((名单< CompleteCartProItem>)响应);
                }     @覆盖
       公共无效onerror的(字符串error_response){}
            });

当我把一个调试指针在 completeCartProItems.addAll((名单&LT; CompleteCartProItem&GT;)响应); 响应不是空的,但<强> completeCartProItems ArrayList是显示为空。

在这里输入的形象描述

变量:

在这里输入的形象描述

我需要通过这个 completeCartProItems 来命名 CartItem_ScrollerAdapter A适配器已落实到 RecycleView

这也执行在 onCreateView 的片段。打完电话后右的getData()方法:

  cart_item_scrollerAdapter =新CartItem_ScrollerAdapter(getActivity(),completeCartProItems);

我把调试指针的 CartItem_ScrollerAdapter 以及在构造函数中。

在这里输入的形象描述

但它也表明,构造函数的参数列表是空的。

如何通过不为空的ArrayList 下面给出的适配器?任何建议将AP preciable。谢谢你。

更新


  

Adapter类:


 公共类CartItem_ScrollerAdapter扩展RecyclerView.Adapter&LT; CartItem_ScrollerAdapter.CartItemViewHolder&GT; {    私人LayoutInflater吹气;
    私人列表&LT; CompleteCartProItem&GT; completeCartProItems =新的ArrayList&LT;&GT;();
    私人上下文的背景下;
    公共CartItem_ScrollerAdapter(上下文的背景下,列表与LT; CompleteCartProItem&GT; completeCartProItems){
        this.inflater = LayoutInflater.from(上下文);
        this.context =背景;
        this.completeCartProItems = completeCartProItems;
    }    @覆盖
    公共CartItemViewHolder onCreateViewHolder(ViewGroup中的父母,INT viewType){
        查看查看= inflater.inflate(R.layout.cart_item,父母,假);
        CartItemViewHolder cartItemViewHolder =新CartItemViewHolder(视图);
        返回cartItemViewHolder;
    }    @覆盖
    公共无效onBindViewHolder(CartItemViewHolder持有人,INT位置){
        CompleteCartProItem proItem = completeCartProItems.get(位置);
        CartDetails细节=(CartDetails)MyApplication.getAndroidSession()的getAttribute(车)。
        holder.cart_pro_name.setText(proItem.getP_name());
        holder.cart_pro_price.setText(RS+(proItem.getP_dscPer()= 0 details.getDiscountPrice(proItem.getP_price(),proItem.getP_dscPer()):!proItem.getP_price()));
        holder.cart_pro_qnty.setText(details.getQntyOfProduct(pr​​oItem.getPid(),proItem.getP_size())+);
        holder.cart_pro_size.setText(proItem.getP_size());
        串IMAGE_URL =htt​​p://10.0.2.2:8080/ECommerceApp/+ proItem.getP_img();
        Picasso.with(上下文).load(IMAGE_URL).into(holder.cart_pro_img);    }    @覆盖
    公众诠释getItemCount(){
        返回completeCartProItems!= NULL? completeCartProItems.size():0;
    }    类CartItemViewHolder扩展RecyclerView.ViewHolder实现View.OnClickListener {
        TextView的cart_pro_name;
        TextView的cart_pro_price;
        TextView的cart_pro_qnty;
        TextView的cart_pro_size;
        ImageView的cart_pro_img;
        的ImageButton cart_remove_btn;
        按钮cart_change;        公共CartItemViewHolder(查看ItemView控件){
            超(ItemView控件);
            cart_pro_name =(TextView中)itemView.findViewById(R.id.cart_item_product_name);
            cart_pro_price =(TextView中)itemView.findViewById(R.id.cart_item_product_price);
            cart_pro_size =(TextView中)itemView.findViewById(R.id.cart_item_size);
            cart_pro_img =(ImageView的)itemView.findViewById(R.id.cart_product_img);
            cart_pro_qnty =(TextView中)itemView.findViewById(R.id.cart_item_qnty);
            // ================================================ ===============================================
            cart_remove_btn =(的ImageButton)itemView.findViewById(R.id.remove_item_btn);
            cart_change =(按钮)itemView.findViewById(R.id.cart_item_change_btn);
            cart_pro_img.setOnClickListener(本);
            cart_remove_btn.setOnClickListener(本);
            cart_change.setOnClickListener(本);        }        @覆盖
        公共无效的onClick(视图v){        }
    }
}

片段:

 公共类CartFragment扩展片段{
    私人RecyclerView cart_horizo​​ntal_scroller;
    私人CartItem_ScrollerAdapter cart_item_scrollerAdapter;
    私人按钮purchase_button;
    私人列表&LT; CompleteCartProItem&GT; completeCartProItems =新的ArrayList&LT;&GT;();
    公共CartFragment(){
        //必需的空公共构造
    }    公共无效的getData(MyCustomListener&LT; CompleteCartProItem&GT; customListener){
        如果(MyApplication.getAndroidSession()的getAttribute(车)!= NULL){
            Log.i(cart_null,不为空);
            请求队列请求队列= VolleySingleton.getsInstance()getRequestQueue()。
            CartDetails cartDetails =(CartDetails)MyApplication.getAndroidSession()的getAttribute(车)。
            的CopyOnWriteArrayList&LT; CartItem&GT; jsonSendArray = cartDetails.getShoppingList();
            最后弦乐jsonString =新GSON()的toJSON(jsonSendArray,
                    新TypeToken&LT;&的CopyOnWriteArrayList LT; CartItem&GT;&GT;(){
                    } .getType());            Log.i(JSON_OBJECT,jsonString);            字符串URL =htt​​p://10.0.2.2:8080/ECommerceApp/getAllProductsAction;
            JsonArrayRequest arrayRequest =新JsonArrayRequest(Request.Method.POST,网址,
                    回应 - &GT; {
                        清单&LT; CompleteCartProItem&GT; completeCart =新GSON()。fromJson(response.toString()
                                新TypeToken&LT;名单,LT; CompleteCartProItem&GT;&GT;(){
                                } .getType());
                        Log.i(反应,completeCart.get(0).getP_name());
                        customListener.onResponse(completeCart);                    },错误 - &GT; Log.i(Volley_error,error.getMessage())){
                @覆盖
                公共地图&LT;字符串,字符串&GT; getHeaders()抛出AuthFailureError {
                    地图&LT;字符串,字符串&GT; PARAMS =新的HashMap&LT;&GT;();
                    params.put(内容类型,应用/ JSON);
                    params.put(cartList,jsonString);
                    返回PARAMS;
                }            };
            arrayRequest.setRetryPolicy(新RetryPolicy(){
                @覆盖
                公众诠释getCurrentTimeout(){
                    回到5000;
                }                @覆盖
                公众诠释getCurrentRetryCount(){
                    回到5000;
                }                @覆盖
                公共无效重试(VolleyError错误)抛出VolleyError {                }
            });
            requestQueue.add(arrayRequest);
        }其他{
            Log.i(cart_null,空);
        }
    }
    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                             捆绑savedInstanceState){
        //充气的布局该片段        查看查看= inflater.inflate(R.layout.fragment_cart,集装箱,FALSE);
        cart_horizo​​ntal_scroller =(RecyclerView)view.findViewById(R.id.horizo​​ntal_scrollView_cart_items);        的getData(新MyCustomListener&LT; CompleteCartProItem&GT;(){            @覆盖
            公共无效onResponse(列表&LT; CompleteCartProItem&GT;响应){
                completeCartProItems.addAll(响应);
                //completeCartProItems.add(new CompleteCartProItem(1,2340.0,额外东方顶,东方,,S,5));
                Log.i(检查,completeCartProItems.get(0).getP_name());            }            @覆盖
            公共无效onerror的(字符串error_response){            }
        });        cart_item_scrollerAdapter =新CartItem_ScrollerAdapter(getActivity(),completeCartProItems);        cart_horizo​​ntal_scroller.setAdapter(cart_item_scrollerAdapter);
        cart_horizo​​ntal_scroller.setLayoutManager(新LinearLayoutManager(getActivity(),
                LinearLayoutManager.HORIZONTAL,FALSE));
        purchase_button =(按钮)view.findViewById(R.id.purchase_btn);
        purchase_button.setOnClickListener(V - &GT; {
            吐司T = Toast.makeText(getActivity(),任职,Toast.LENGTH_LONG);
            t.show();
        });
        返回视图。
    }
}


解决方案

确定。在参考上述评论,我写了一些步骤,你应该尝试,因为我没有什么可能是错误的清晰画面。

让我们先从你的 MyCustomListener 。我不知道为什么你的反应类型设置为对象。如果是多个请求使用,那么你可以修改它像泛型以下

 公共接口MyCustomListener&LT; T&GT; {    公共无效onResponse(T响应);    公共无效onerror的(字符串error_response);
}

然后使用它像这样当需要一个回调

 的getData(新MyCustomListener&LT;名单,LT; CompleteCartProItem&GT;&GT;(){
      @覆盖
      公共无效onResponse(列表&LT; CompleteCartProItem&GT;响应){
        completeCartProItems.addAll(响应);
      }     @覆盖
       公共无效onerror的(字符串error_response){
         //处理错误
       }
});

另外,还要确保你没有重新初始化 completeCartProItems 回调后在其他地方。

不是真的知道下面会解决您的问题,但请确保您的回调在UI线程中执行了。

I m trying to extract android volley response to a member variable of the same class. I used callback interfaces to perform this task :

public void getData(MyCustomListener customListener) {

JsonArrayRequest arrayRequest = new JsonArrayRequest(Request.Method.POST, url,
      response -> {
              Log.i("response",response.toString());
              customListener.onResponse(completeCart);

              },
      error -> Log.i("Volley_error", error.getMessage())) {
      ...

CustomerListener interface:

public interface MyCustomListener {

    public void onResponse(Object response);

    public void onError(String error_response);
}

And inside onCreateView method of the fragment :

getData(new MyCustomListener() {
      @Override
      public void onResponse(Object response) {
        completeCartProItems.addAll((List<CompleteCartProItem>) response);
                }

     @Override
       public void onError(String error_response) {}
            });

When I put a debug pointer at completeCartProItems.addAll((List<CompleteCartProItem>) response); response is not empty but completeCartProItems arraylist is shown as empty.

Variables :

I need to pass this completeCartProItems to a Adapter named CartItem_ScrollerAdapter which has implemented to a RecycleView.

This implementation also inside the onCreateView of the fragment. right after calling getData() method :

cart_item_scrollerAdapter = new CartItem_ScrollerAdapter(getActivity(), completeCartProItems);

I put debug pointer inside the constructor of the CartItem_ScrollerAdapter as well.

But it also shows that the List parameter of the constructor is empty.

How to pass not empty ArrayList to the adapter given below ?? Any suggestions will be appreciable. Thank you.

UPDATE

Adapter class :

public class CartItem_ScrollerAdapter extends RecyclerView.Adapter<CartItem_ScrollerAdapter.CartItemViewHolder> {

    private LayoutInflater inflater;
    private List<CompleteCartProItem> completeCartProItems = new ArrayList<>();
    private Context context;


    public CartItem_ScrollerAdapter(Context context,  List<CompleteCartProItem> completeCartProItems) {
        this.inflater = LayoutInflater.from(context);
        this.context = context;
        this.completeCartProItems = completeCartProItems;
    }

    @Override
    public CartItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.cart_item, parent, false);
        CartItemViewHolder cartItemViewHolder = new CartItemViewHolder(view);
        return cartItemViewHolder;
    }

    @Override
    public void onBindViewHolder(CartItemViewHolder holder, int position) {
        CompleteCartProItem proItem = completeCartProItems.get(position);
        CartDetails details = (CartDetails) MyApplication.getAndroidSession().getAttribute("cart");
        holder.cart_pro_name.setText(proItem.getP_name());
        holder.cart_pro_price.setText("Rs " + (proItem.getP_dscPer() != 0 ? details.getDiscountPrice(proItem.getP_price(), proItem.getP_dscPer()) : proItem.getP_price()));
        holder.cart_pro_qnty.setText(details.getQntyOfProduct(proItem.getPid(), proItem.getP_size()) + "");
        holder.cart_pro_size.setText(proItem.getP_size());
        String image_url = "http://10.0.2.2:8080/ECommerceApp/" + proItem.getP_img();
        Picasso.with(context).load(image_url).into(holder.cart_pro_img);

    }

    @Override
    public int getItemCount() {
        return completeCartProItems != null ? completeCartProItems.size() : 0;
    }

    class CartItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView cart_pro_name;
        TextView cart_pro_price;
        TextView cart_pro_qnty;
        TextView cart_pro_size;
        ImageView cart_pro_img;
        ImageButton cart_remove_btn;
        Button cart_change;

        public CartItemViewHolder(View itemView) {
            super(itemView);
            cart_pro_name = (TextView) itemView.findViewById(R.id.cart_item_product_name);
            cart_pro_price = (TextView) itemView.findViewById(R.id.cart_item_product_price);
            cart_pro_size = (TextView) itemView.findViewById(R.id.cart_item_size);
            cart_pro_img = (ImageView) itemView.findViewById(R.id.cart_product_img);
            cart_pro_qnty = (TextView) itemView.findViewById(R.id.cart_item_qnty);
            //===============================================================================================
            cart_remove_btn = (ImageButton) itemView.findViewById(R.id.remove_item_btn);
            cart_change = (Button) itemView.findViewById(R.id.cart_item_change_btn);
            cart_pro_img.setOnClickListener(this);
            cart_remove_btn.setOnClickListener(this);
            cart_change.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {

        }
    }
}

Fragment :

public class CartFragment extends Fragment {
    private RecyclerView cart_horizontal_scroller;
    private CartItem_ScrollerAdapter cart_item_scrollerAdapter;
    private Button purchase_button;
    private List<CompleteCartProItem> completeCartProItems = new ArrayList<>();


    public CartFragment() {
        // Required empty public constructor
    }

    public void getData(MyCustomListener<CompleteCartProItem> customListener) {
        if (MyApplication.getAndroidSession().getAttribute("cart") != null) {
            Log.i("cart_null", "NOT null");
            RequestQueue requestQueue = VolleySingleton.getsInstance().getRequestQueue();
            CartDetails cartDetails = (CartDetails) MyApplication.getAndroidSession().getAttribute("cart");
            CopyOnWriteArrayList<CartItem> jsonSendArray = cartDetails.getShoppingList();
            final String jsonString = new Gson().toJson(jsonSendArray,
                    new TypeToken<CopyOnWriteArrayList<CartItem>>() {
                    }.getType());

            Log.i("json_object", jsonString);

            String url = "http://10.0.2.2:8080/ECommerceApp/getAllProductsAction";
            JsonArrayRequest arrayRequest = new JsonArrayRequest(Request.Method.POST, url,
                    response -> {
                        List<CompleteCartProItem> completeCart = new Gson().fromJson(response.toString(),
                                new TypeToken<List<CompleteCartProItem>>() {
                                }.getType());
                        Log.i("response", completeCart.get(0).getP_name());
                        customListener.onResponse(completeCart);

                    }, error -> Log.i("Volley_error", error.getMessage())) {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> params = new HashMap<>();
                    params.put("Content-Type", "application/json");
                    params.put("cartList", jsonString);
                    return params;
                }

            };
            arrayRequest.setRetryPolicy(new RetryPolicy() {
                @Override
                public int getCurrentTimeout() {
                    return 5000;
                }

                @Override
                public int getCurrentRetryCount() {
                    return 5000;
                }

                @Override
                public void retry(VolleyError error) throws VolleyError {

                }
            });
            requestQueue.add(arrayRequest);
        } else {
            Log.i("cart_null", "null");
        }


    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view = inflater.inflate(R.layout.fragment_cart, container, false);
        cart_horizontal_scroller = (RecyclerView) view.findViewById(R.id.horizontal_scrollView_cart_items);

        getData(new MyCustomListener<CompleteCartProItem>() {

            @Override
            public void onResponse(List<CompleteCartProItem> response) {
                completeCartProItems.addAll(response);
                //completeCartProItems.add(new CompleteCartProItem(1, 2340.0, "Extra Orient Top", "Orient", "", "S", 5));
                Log.i("check", completeCartProItems.get(0).getP_name());

            }

            @Override
            public void onError(String error_response) {

            }
        });

        cart_item_scrollerAdapter = new CartItem_ScrollerAdapter(getActivity(), completeCartProItems);

        cart_horizontal_scroller.setAdapter(cart_item_scrollerAdapter);
        cart_horizontal_scroller.setLayoutManager(new LinearLayoutManager(getActivity(),
                LinearLayoutManager.HORIZONTAL, false));
        purchase_button = (Button) view.findViewById(R.id.purchase_btn);
        purchase_button.setOnClickListener(v -> {
            Toast t = Toast.makeText(getActivity(), "Worked", Toast.LENGTH_LONG);
            t.show();
        });
        return view;
    }


}

解决方案

Ok. In reference to the comment above, I am writing some steps you should try since I do not have a clear picture of what might be wrong.

Let's start with your MyCustomListener. I do not know why are you setting the response type to Object. If it is to use this in multiple requests then you can modify it like the following with generics

public interface MyCustomListener<T> {

    public void onResponse(T response);

    public void onError(String error_response);
}

then use it like this when a callback is needed

getData(new MyCustomListener<List<CompleteCartProItem>>() {
      @Override
      public void onResponse(List<CompleteCartProItem> response) {
        completeCartProItems.addAll(response);
      }

     @Override
       public void onError(String error_response) {
         //handle error
       }
});

Also make sure you are not re-initialising completeCartProItems elsewhere after the callback.

Not really sure if the following will fix your issue but make sure that your callback is executed in the UI thread, too.

这篇关于与回调接口访问凌空响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆