简体   繁体   English

解析json后无法在incyclerview上显示int或double

[英]Can't get int or double to display on RecyclerView after parsing json

When I just display string data it seems to show up fine, but when I try to display an int or double the RecyclerView won't populate. 当我只显示字符串数据时,看起来似乎很好,但是当我尝试显示int或double时,不会填充RecyclerView。 I am pulling from the Google places API JSON. 我从Google Places API JSON中提取。 I think maybe it is the way I'm using my onBindViewHolder() ? 我认为这可能是我使用onBindViewHolder()吗? Thanks 谢谢

// MainActivity
private void getJson() {

    String URL = https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=40.7085,-74.003124&opennow&radius=5000&type=restaurant&key=

    JsonObjectRequest root = new JsonObjectRequest(Request.Method.GET, URL, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray results = response.getJSONArray("results");
                Log.d("RESULTS", String.valueOf(results));
                for(int i = 0; i<results.length(); i++) {
                    JSONObject resultsObj = results.getJSONObject(i);

                    mImageUrls.add(resultsObj.getString("icon"));
                    mTitle.add(resultsObj.getString("name"));
                    //mRating.add(resultsObj.getDouble("rating"));
                    mPriceLevel.add(resultsObj.getInt("price_level"));
                }
                getRecyclerView();

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    },new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

    mRequestQueue.add(root);
}

private void getRecyclerView() {
    // LinearLayoutManager
    recyclerView = findViewById(R.id.recyclerView);
    adapter = new RecyclerViewAdapter(mImageUrls, mTitle, mPriceLevel, this);

    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setHasFixedSize(true);
}

And the RecyclerViewAdapter Class is. RecyclerViewAdapter类是。

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{

    private static final String TAG = "RecyclerViewAdapter";

    private ArrayList<String> rNames = new ArrayList<>();
    private ArrayList<String> rImageUrls = new ArrayList<>();
    private ArrayList<Double> rRatings = new ArrayList<>();
    private ArrayList<Integer> rPriceLevel = new ArrayList<>();

    private Context mContext;

    public RecyclerViewAdapter(ArrayList<String> image, ArrayList<String> name, ArrayList<Integer> priceLevel, Context context) {//, ArrayList<Double> rating
        this.rImageUrls = image;
        this.rNames = name;
        //this.rRatings = rating;
        this.rPriceLevel = priceLevel;
        mContext = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
        //return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
        Glide.with(mContext).asBitmap().load(rImageUrls.get(position)).into(holder.image);
        holder.name.setText(rNames.get(position));
        //holder.rating.setText(rRatings.get(position));
        holder.priceLevel.setText(rPriceLevel.get(position));

        holder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: clicked on an image: " + rNames.get(position));
                Toast.makeText(mContext, rNames.get(position), Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return rNames.size(); //we can use rImageUrls/rRatings as well because they are all the same size
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        ImageView image;
        TextView name;
        TextView rating;
        TextView priceLevel;
        TextView address;
        RelativeLayout parentLayout;

        public ViewHolder(View itemView) {
            super(itemView);
            image = (ImageView) itemView.findViewById(R.id.image);
            name = (TextView) itemView.findViewById(R.id.title);
            //rating = itemView.findViewById(R.id.rating);
            priceLevel = (TextView) itemView.findViewById(R.id.priceLevel);

            parentLayout = itemView.findViewById(R.id.parentLayout);
        }
    }
}

The reason for this is you are not converting Double to String change this line holder.rating.setText(rRatings.get(position)); 原因是您没有将Double转换为String,请更改此行holder.rating.setText(rRatings.get(position)); to holder.rating.setText(String.valueOf(rRatings.get(position))); holder.rating.setText(String.valueOf(rRatings.get(position)));

I would like to suggest you to create an object having all necessary parameters in it and then pass a single list of that object to the RecyclerViewAdapter . 我建议您创建一个包含所有必需参数的对象,然后将该对象的单个列表传递给RecyclerViewAdapter

public class MapElement {
    public String name;
    public String imageUrl;
    public Double rating;
    public Integer price;
}

Then create an ArrayList of this object when you get the response from your getJson function call. 然后,当您从getJson函数调用获得响应时,请为此对象创建一个ArrayList Now in your adapter just use a single list of MapElement object to show the data from there. 现在,在适配器中,只需使用一个MapElement对象列表即可显示其中的数据。

The modified adapter should look like this. 修改后的适配器应如下所示。

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{

    private static final String TAG = "RecyclerViewAdapter";

    private ArrayList<MapElement> elements = new ArrayList<>();

    private Context mContext;

    public RecyclerViewAdapter(ArrayList<MapElement> elements, Context context) {
        this.elements = elements;
        mContext = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
        Glide.with(mContext).asBitmap().load(rImageUrls.get(position)).into(holder.image);
        holder.name.setText(elements.get(position).name);
        holder.rating.setText(elements.get(position).rating);
        holder.priceLevel.setText(elements.get(position).price);

        holder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: clicked on an image: " + rNames.get(position));
                Toast.makeText(mContext, elements.get(position).name, Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return elements.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        ImageView image;
        TextView name;
        TextView rating;
        TextView priceLevel;
        TextView address;
        RelativeLayout parentLayout;

        public ViewHolder(View itemView) {
            super(itemView);
            image = (ImageView) itemView.findViewById(R.id.image);
            name = (TextView) itemView.findViewById(R.id.title);
            rating = itemView.findViewById(R.id.rating);
            priceLevel = (TextView) itemView.findViewById(R.id.priceLevel);

            parentLayout = itemView.findViewById(R.id.parentLayout);
        }
    }
}

First you should check that the rating you are getting is a double value. 首先,您应该检查所获得的评级是否为双精度值。 It might be the case that an exception is thrown after this line 可能是在此行之后引发异常的情况

mRating.add(resultsObj.getDouble("rating"))

Also as @hooray_todd siggested textview only takes string value so you have to change your data into string. 同样,由于@hooray_todd,已签名的textview仅采用字符串值,因此您必须将数据更改为字符串。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM