使用回调接口访问排球响应

时间:2016-03-07 02:41:40

标签: android android-asynctask android-volley

我试图将android排球响应提取到同一个类的成员变量。我使用回调接口来执行此任务:

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接口:

public interface MyCustomListener {

    public void onResponse(Object response);

    public void onError(String error_response);
}

片段内的onCreateView方法:

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

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

当我将调试指针放在completeCartProItems.addAll((List<CompleteCartProItem>) response); 响应时不为空,但 completeCartProItems arraylist显示为空。

enter image description here

变量:

enter image description here

我需要将此completeCartProItems传递给名为CartItem_ScrollerAdapter的适配器,该适配器已实现为RecycleView

此实现也位于片段的onCreateView内。在调用getData()方法之后:

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

我也将调试指针放在CartItem_ScrollerAdapter的构造函数中。

enter image description here

但它也表明构造函数的List参数为空。 enter image description here

如何将非空ArrayList传递给下面给出的适配器?任何建议都会很明显。谢谢。

更新

  

适配器类:

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) {

        }
    }
}

片段:

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;
    }


}

1 个答案:

答案 0 :(得分:0)

确定。在参考上面的评论时,我正在写一些你应该尝试的步骤,因为我没有清楚地了解可能出现的问题。

让我们从你的MyCustomListener开始吧。我不知道你为什么要把响应类型设置为Object。如果要在多个请求中使用它,那么您可以像使用泛型

一样修改它
public interface MyCustomListener<T> {

    public void onResponse(T response);

    public void onError(String error_response);
}

然后在需要回调时使用它

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

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

另外,请确保在回调后不在其他位置重新初始化completeCartProItems

不确定以下内容是否可以解决您的问题,但也要确保您的回调也在UI线程中执行。