【问题标题】:Accessing volley response with callback interfaces使用回调接口访问凌空响应
【发布时间】:2016-06-20 12:10:32
【问题描述】:

我正在尝试提取 android volley 对同一类的成员变量的响应。我使用回调接口来执行这个任务:

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&lt;CompleteCartProItem&gt;) response); 时,response 不为空,但 completeCartProItems 数组列表显示为空。

变量:

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

这个实现也在片段的onCreateView里面。在调用getData() 方法之后:

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

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

但是也说明构造函数的List参数是空的。

如何将非空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;
    }


}

【问题讨论】:

  • 奇怪。您可以通过循环响应对象进行调试并尝试将其一一添加到completeCartProItems 列表中吗?
  • 我认为它不会起作用。因为addAll()也在幕后做了迭代机制。但我会尝试...
  • 是的,但是您可以在循环内设置一个断点,看看它是否真的添加到列表中。顺便说一句,我不熟悉 Volley 但你不能在你的 MyCustomListener's OnResponse 方法中将类型设置为 List&lt;CompleteCartProItem&gt; 吗?
  • 我做了你要求我做的所有改变。并且仍然得到相同的结果。我将 Log 放在 for 循环中,并且该日志也执行得很好。 public void onResponse(List&lt;CompleteCartProItem&gt; response) { List&lt;CompleteCartProItem&gt; ccp = response; for (CompleteCartProItem p_proItem : ccp) { Log.i("check",p_proItem.getP_name()); completeCartProItems.add(p_proItem); } }
  • 请尝试更改为CartItem_ScrollerAdapter(Context context, List&lt;CompleteCartProItem&gt; completeCartProItems) 而不是CartItem_ScrollerAdapter(Context context, List completeCartProItems)

标签: android android-asynctask android-volley


【解决方案1】:

好的。参考上面的评论,我正在写一些你应该尝试的步骤,因为我不清楚可能出了什么问题。

让我们从您的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 线程中执行。

【讨论】:

  • 我尝试了您要求的所有修改...但 ArrayList 的大小仍然为 0。
  • 如果您还没有解决您的问题,您能否将您的整个适配器和活动/片段类发布到您请求 CartProItems 的位置
  • @MadushanPerera 将此public void getData(MyCustomListener&lt;CompleteCartProItem&gt; customListener) 更改为此public void getData(MyCustomListener&lt;List&lt;CompleteCartProItem&gt;&gt; customListener)
  • 你确定我真的需要做出改变吗???我的界面如下:public interface MyCustomListener&lt;T&gt; { public void onResponse( List&lt;T&gt; response); public void onError(String error_response); }
  • 如果这样做,我的覆盖方法将是:@Override public void onResponse(List&lt;List&lt;CompleteCartProItem&gt;&gt; response) { }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2016-11-20
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
相关资源
最近更新 更多