与回调接口访问凌空响应 [英] Accessing volley response with callback interfaces
问题描述
我米试图提取的Android凌空响应同一类的成员变量。我用的回调接口来执行此任务:
公共无效的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((名单< CompleteCartProItem>)响应);
响应不是空的,但<强> 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(proItem.getPid(),proItem.getP_size())+);
holder.cart_pro_size.setText(proItem.getP_size());
串IMAGE_URL =http://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_horizontal_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 =http://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_horizontal_scroller =(RecyclerView)view.findViewById(R.id.horizontal_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_horizontal_scroller.setAdapter(cart_item_scrollerAdapter);
cart_horizontal_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 namedCartItem_ScrollerAdapter
which has implemented to aRecycleView
.This implementation also inside the
onCreateView
of the fragment. right after callinggetData()
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 toObject
. If it is to use this in multiple requests then you can modify it like the following with genericspublic 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屋!