从arraylist和settext里面获取字符串android

时间:2017-09-25 04:17:21

标签: android android-fragments arraylist

我想从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;
}

3 个答案:

答案 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答案的具体实现,您不会改变很多代码。