2016-03-07 17 views
0

我试图提取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<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

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

如何不为空ArrayList通过下面给出的适配器?任何建议都是可观的。谢谢。

UPDATE

适配器类:

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


} 
+0

奇怪。你可以调试循环响应对象,并尝试逐个添加到'completeCartProItems'列表中? –

+0

我不认为它会工作。因为'addAll()'也会在场景后面执行迭代机制。但我会尝试... –

+0

是的,但你可以在循环内设置一个断点,看它是否真的添加到列表中。顺便说一句,我不熟悉排球,但不能设置类型'名单'在''MyCustomListener's'方法OnResponse'? –

回答

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线程中执行。

+0

我尝试过所有你所要求的修改...但ArrayList的大小仍然是0. –

+0

如果你还没有解决你的问题是,你可以发布你的整个适配器以及您所请求的** ** CartProItems我 –

+0

已经更新了我的问题活动/片段类。请检查.... –