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

标签 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 Activity 。

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);


        }
    }
}

最佳答案

我认为问题在:

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

您的 json 尚未下载用于获取值的 key 。当代码运行到这一行时,发生异常,程序进入 catch block ,其他属性将永远不会被分配数据。 我建议在获取其值之前检查 json key 是否存在。

关于android - 如何从android中的json中获取数据并显示在RecyclerView中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39231930/

相关文章:

android - 调试和生产资源

android - 如何在android上获取处理器编号

javascript - 将表单作为 json 传递给 Controller ​​并解析

ios - 从 JSON 转换时,NSArray 包含一个缺少引号的字符串?

javascript - 文本响应需要 Double JSON.parse() 的实例

javascript - Node.js、Ajax发送和接收Json

javascript - 移动浏览器中调用事件的问题

android - 嵌套 ScrollView 布局下回收器 View 的 Scrolltoposition/smoothscrolltoposition

android - 在列表项中添加 ListView

json - 'docker images' 使用 --format 输出为 json