如何从android中的json获取数据并在RecyclerView中显示?

时间:2016-08-30 15:44:09

标签: android json

我正在创建一个Android应用程序,用于从URL获取JSON数据,然后在RecyclerView中显示它。

我的JSON数据

[{"email":"abc@gmail.com","photo":"http:\/\/www.example.com\/x.jpg","bookname":"one","price":"30","num":"3","avg":"3.9","author":"none"}]

但只提取booknamephoto个键值。其他参数为空,但我的代码是正确的,因为如果它是错误的,甚至不应该提取bookname

我的代码是:

public class dashBoard extends AppCompatActivity {


    private List<myDash> dash;
    private Toolbar mToolbar;
    Button read;
    //Creating Views
    int temp=0;
    float starts=0;
    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager layoutManager;
    private RecyclerView.Adapter adapter;
    public  String ratenumS,numberS;
   public  String bookName,price,rating;
    private RequestQueue requestQueue;
    String mail_one;

    private int requestCount = 1;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dash_bord);

        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        //Initializing our superheroes list
        dash = new ArrayList<>();
        requestQueue = Volley.newRequestQueue(this);

        getDash();

        //Adding an scroll change listener to recyclerview
        recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);

                getDash();
            }
        });

        //initializing our adapter
        adapter = new dashCard(dash, this);

        //Adding adapter to recyclerview
        recyclerView.setAdapter(adapter);


    }


    private JsonArrayRequest getDataFromDash(int requestCount) {
        //Initializing ProgressBar
        final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar3);

        //Displaying Progressbar
        progressBar.setVisibility(View.VISIBLE);
        setProgressBarIndeterminateVisibility(true);

        SharedPreferences pre = PreferenceManager.getDefaultSharedPreferences(dashBoard.this);

        mail_one = pre.getString("mail2", "DEFAULT VALUE");

        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest("http://www.example.com/getDash.php?page="+ String.valueOf(requestCount )+"&email="+mail_one,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        //Calling method parseData to parse the json response
                        parseData(response);
                        //Hiding the progressbar
                        progressBar.setVisibility(View.GONE);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        progressBar.setVisibility(View.GONE);



                        if(temp==0) {
                            Toast.makeText(dashBoard.this, "No More Items Available   "+bookName+"book "+price+" "+ratenumS+"      "+numberS+"  "+mail_one, Toast.LENGTH_SHORT).show();
                            temp++;
                        }
                    }

                }

        //Returning the request
        return jsonArrayRequest;
    }

    private void getDash() {
        //Adding the method to the queue by calling the method getDataFromServer
        requestQueue.add(getDataFromDash(requestCount));
        //Incrementing the request counter
        requestCount++;
    }

    //This method will parse json data
    private void parseData(JSONArray array) {
        for (int i = 0; i < array.length(); i++) {
            myDash dash1 = new myDash();



            JSONObject json = null;
            try {
                //Getting json
                json = array.getJSONObject(i);

                dash1.setImageUrl(json.getString("photo"));
                dash1.setBook_name(json.getString("bookname"));
                dash1.setNo_down(json.getString("download"));
                dash1.setBook_price(json.getString("price"));
                dash1.setStar_num(json.getString("num"));
                dash1.setAvg_rate(Float.parseFloat(json.getString("avg")));


            } catch (JSONException e) {
                e.printStackTrace();
            }
            //Adding the superhero object to the list
            dash.add(dash1);
        }

        //Notifying the adapter that data has been added or changed
        adapter.notifyDataSetChanged();
    }

有没有人知道为什么这段代码不起作用?

我的dashCard活动。

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


    private ImageLoader imageLoader;
    private Context context;

    //List to store all superheroes
    List<myDash> secDash1;

    //Constructor of this class
    public dashCard(List<myDash> secDash1, Context context){
        super();
        //Getting all superheroes
        this.secDash1 = secDash1;
        this.context = context;
    }

    //In
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.dash_bord, parent, false);
        ViewHolder viewHolder = new ViewHolder(v);

        return viewHolder;

    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        final myDash secDash = secDash1.get(position);



        imageLoader = CustomVolleyRequest.getInstance(context).getImageLoader();

        imageLoader.get(secDash.getImageUrl(),ImageLoader.getImageListener(holder.imageView, R.drawable.image, android.R.drawable.ic_dialog_alert));


        holder.imageView.setImageUrl(secDash.getImageUrl(), imageLoader);
        holder.bookName.setText(secDash.getBook_name());
        holder.price.setText(secDash.getBook_price());
        holder.numberD.setText(secDash.getStar_num());
        //holder.rate.setText(Float.toString(secDash.getAvg_rate()));
        holder.download.setText(secDash.getNo_down());
      //  holder.star.setRating(secDash.getAvg_rate());

    }





    public int getItemCount() {
        return secDash1.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder{
        //Views
        public NetworkImageView imageView;
        public TextView bookName;
        public TextView price;
        public TextView numberD;
        public TextView rate;
        RatingBar star;
        public TextView download;


        //Initializing Views
        public ViewHolder(View itemView) {
            super(itemView);
            imageView = (NetworkImageView) itemView.findViewById(R.id.dashImage);
            bookName = (TextView) itemView.findViewById(R.id.bookName4);
            price = (TextView) itemView.findViewById(R.id.priceDash);
            numberD = (TextView) itemView.findViewById(R.id.numberDash);
            rate = (TextView) itemView.findViewById(R.id.ratenumDash);
            star = (RatingBar) itemView.findViewById(R.id.rateDash);
            download = (TextView) itemView.findViewById(R.id.download);


        }
    }
}

2 个答案:

答案 0 :(得分:1)

我认为问题出在:

dash1.setNo_down(json.getString("download"));

您的json没有下载获取值的密钥。当代码在此行上运行时,发生异常并且程序转到catch块,其他属性将永远不会被分配数据。 我建议在获取其值之前检查json密钥。

答案 1 :(得分:0)

你没有“download”作为json中的键,因为抛出了导致其他键未分配的异常