我想从oncreateview片段里面的arraylist中获取字符串,但由于没有位置索引通过,所以我无法计算它。 get(position)返回错误。 String price = arrayList.get(position).getPrice();
我需要获得价格的字符串价格和settext。这是我的主要关注点。 这个值应该从arraylist返回。
这是使用mysingleton从volley响应JSON数组。
Single Product Response: [{"price":"75","date":"2017-07-13 03:25:31","pk_i_id":"4"}]
这个主要的活动片段
public class MainActivityFragment extends Fragment {
private TextView product,price,date,title;
private String product_id;
ArrayList<ProductItem> arrayList = new ArrayList<>();
Context context;
public MainActivityFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_main_activity, container, false);
product = (TextView) view.findViewById(R.id.tv1);
title = (TextView) view.findViewById(R.id.tvTitle);
price = (TextView) view.findViewById(R.id.tvPrice);
date = (TextView) view.findViewById(R.id.tvDate);
if (getArguments() != null) {
Log.i(TAG, "getArgument is not null");
product_id = getArguments().getString("product_id");
ProductBackgroundTask productBackgroundTask = new ProductBackgroundTask(this.getActivity(), product_id);
arrayList = productBackgroundTask.getList();
String price = arrayList.get(position).getPrice();
// Log.d(TAG, "price: " + price);
product.setText(product_id);
// price.setText(price);
}else {
Log.i(TAG, "getArgument is null");
}
return view;
}
}
这是使用排球获得arraylist的任务
public class ProductBackgroundTask {
private Context context;
ArrayList<ProductItem> arrayList = new ArrayList<>();
String json_url = "phpfile.php";
private String product_id;
public ProductBackgroundTask(Context context, String product_id) {
this.context = context;
this.product_id = product_id;
}
public ArrayList<ProductItem> getList(){
StringRequest stringRequest = new StringRequest(Request.Method.POST, json_url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Single Product Response: " + response);
try {
JSONArray jsonarr = new JSONArray(response);
for (int i = 0; i < jsonarr.length(); i++) {
JSONObject jsonobj = jsonarr.getJSONObject(i);
ProductItem productItem = new ProductItem(jsonobj.getString("price"), jsonobj.getString("date"), jsonobj.getInt("pk_i_id"));
arrayList.add(productItem);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> params = new HashMap<>();
params.put("product_id", product_id);
return params;
}
};
MySingleton.getInstance(context).addToRequestQueue(stringRequest);
return arrayList;
}
}
这是数组列表的类
public class ProductItem {
private String Price,Date;
private int ProductId;
public ProductItem(String Price, String Date, int ProductId){
this.setPrice(Price);
this.setDate(Date);
this.setProductId(ProductId);
}
public int getProductId() {
return ProductId;
}
public void setProductId(int productId) {
ProductId = productId;
}
public String getPrice() {
return Price;
}
public void setPrice(String price) {
Price = price;
}
public String getDate() {
return Date;
}
public void setDate(String date) {
Date = date;
}
答案 0 :(得分:0)
显然在你的oncreate中你没有初始化产品项目,你无法解析完整列表。你可以尝试两个来解决这个问题
1.通过特定的项目编号而不是位置,即 如果你想显示第4项然后位置= 3
2.或者像这样写一个循环来解析像这样的整个arrayList
for(ProductItem productItem:arrayList){
String price = productItem.getPrice();
// Log.d(TAG, "price: " + price);
product.setText(product_id);
price.setText(price);
}
答案 1 :(得分:0)
错误的是,在MainActivityFragment中,您尝试将值分配给arrayList,甚至在将数据添加到ProductBackgroundTask-getList中的arrayList之前。这就是你一直让列表为空的原因。尝试使用接口。
1.使您的MainActivityFragment实现界面。
2.从服务器获取数据后,将值设置为接口方法。
3.获取MainActivityFragment内部接口方法中的数据,并执行您在onCreateView方法中执行的所有操作。
现在你的arraylist将拥有从服务器收到的任何数据。
如果您以前没有使用它们,下面是接口上示例的链接。他完全按照你的要求行事。
https://www.justinmccandless.com/post/setting-up-a-callback-function-in-android/
答案 2 :(得分:0)
请允许我在您致电arrayList
时,您getList
返回的String price = arrayList.get(position).getPrice();
不会被填充。使用volley进行的服务器调用需要一些时间来处理,并且onResponse
被调用时需要一些时间。这是在您返回实际为空的arrayList之后发生的。
事件顺序如下。
•调用arrayList = productBackgroundTask.getList();
,返回一个空的ArrayList。
•String price = arrayList.get(position).getPrice();
过了一段时间......
•onResponse
内的getList()
被调用。
你现在明白为什么它是空的吗?
简单解决方案:
•在ProductListener
旁边定义一个简单的界面ProductBackgroundTask
。 (仅使用一种抽象方法onProducts
)。
•使用匿名类在Fragment&#39; onCreateView
内实例化它,并将其传递给ProductListener
的构造函数以保存以供以后使用。对onProducts
方法中的产品做任何想做的事情。 (因为这将使用实际数据调用)
•使用onProducts
方法中解析和提取的数据调用其onResponse
方法。
ProductBackgroundTask
代码:
public class ProductBackgroundTask {
private Context context;
// I removed the instance ArrayList since that can be made
// local.
// Here, we add a reference to our callback interface as we can use it later.
private ProductListener listener;
String json_url = "http://192.168.43.55/android/v1/productList.php";
private String product_id;
// Instantiate this class using an additional listener argument
// which would be a concrete implementation of our interface.
public ProductBackgroundTask(Context context, String product_id, ProductListener listener) {
this.context = context;
this.product_id = product_id;
this.listener = listener;
}
// getList should not return anything,
// so I keep the return as void.
public void getList() {
StringRequest stringRequest = new StringRequest(Request.Method.POST, json_url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
ArrayList<ProductItem> arrayList = new ArrayList<>();
Log.d(TAG, "Single Product Response: " + response);
try {
JSONArray jsonarr = new JSONArray(response);
for (int i = 0; i < jsonarr.length(); i++) {
JSONObject jsonobj = jsonarr.getJSONObject(i);
ProductItem productItem = new ProductItem(jsonobj.getString("price"), jsonobj.getString("date"), jsonobj.getInt("pk_i_id"));
arrayList.add(productItem);
}
// Notice this line here, this is what
// calls the callback with the products.
listener.onProducts(arrayList);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> params = new HashMap<>();
params.put("product_id", product_id);
return params;
}
};
MySingleton.getInstance(context).addToRequestQueue(stringRequest);
}
}
// Callback interface, we would need a concrete implementation
// of this and pass that to the constructor of ProductBackgroundTask.
interface ProductListener {
void onProducts(ArrayList<ProductItem> products);
}
onCreateView
内的代码:
ProductBackgroundTask productBackgroundTask = new ProductBackgroundTask(this.getActivity(), product_id, new ProductListener() {
// This method will be called with the needed products.
// Give an anonymous class implementation of our interface
// right here since we won't be using it anymore.
public void onProducts(ArrayList<ProductItem> products) {
// Get the price you want.
String str = arrayList.get(0).getPrice();
// Use str wherever necessary. Use the UI thread here if you need
// to change any visible elements on the screen.
}
});
// Simply call this method to get the ball rolling.
productBackgroundTask.getList();
这是this答案的具体实现,您不会改变很多代码。