【问题标题】:how to show this json on recyclerview?如何在recyclerview上显示这个json?
【发布时间】:2020-04-20 02:04:13
【问题描述】:

我是 android 编程新手,我想在我的 recyclerview 上显示这个 json,但我得到了 null,我对此一无所知。 我搜索了很多,但找不到任何有用的东西。

json_url http://192.168.1.200:5454/api/Goods/?CategoryId=0&PageSize=10&PageNumber=1&Filter=

主活动

private RetrofitAdapter retrofitAdapter;
private RecyclerView recyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    recyclerView = findViewById(R.id.recycler);

    fetchJSON();

}

private void fetchJSON(){

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(RecyclerInterface.JSONURL)
            .addConverterFactory(ScalarsConverterFactory.create())
            .build();

    RecyclerInterface api = retrofit.create(RecyclerInterface.class);

    Call<String> call = api.getString();

    call.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            Log.i("Responsestring", response.body().toString());
            if (response.isSuccessful()) {
                if (response.body() != null) {
                    Log.i("onSuccess", response.body().toString());

                    String jsonresponse = response.body().toString();
                    onRecycler(jsonresponse);

                } else {
                    Log.i("onEmptyResponse", "Returned empty response");
                }
            }
        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {

        }
    });
}

private void onRecycler(String response){

    try {
        //getting the whole json object from the response
        JSONObject obj = new JSONObject(response);
        if(obj.optString("status").equals("200")){

            ArrayList<ModelRecycler> modelRecyclerArrayList = new ArrayList<>();
            JSONArray dataArray  = obj.getJSONArray("data");

            for (int i = 0; i < dataArray.length(); i++) {

                ModelRecycler modelRecycler = new ModelRecycler();
                JSONObject dataobj = dataArray.getJSONObject(i);

                modelRecycler.setImageURL(dataobj.getString("imageURL"));
                modelRecycler.setCategoryTitle(dataobj.getString("categoryTitle"));
                modelRecycler.setNumber(dataobj.getString("number"));
                modelRecycler.setTitle1(dataobj.getString("title1"));
                modelRecycler.setTitle2(dataobj.getString("title2"));

                modelRecyclerArrayList.add(modelRecycler);

            }

            retrofitAdapter = new RetrofitAdapter(this,modelRecyclerArrayList);
            recyclerView.setAdapter(retrofitAdapter);
            recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(),  
            LinearLayoutManager.VERTICAL, false));
            }else {
            Toast.makeText(MainActivity.this, obj.optString("message")+"",  
            Toast.LENGTH_SHORT).show();
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

}

模型回收器

private String categoryTitle, number, title1, title2, imageURL;

public void setCategoryTitle(String categoryTitle) {
    this.categoryTitle = categoryTitle;
}

public String getCategoryTitle() {
    return categoryTitle;
}

public void setNumber(String number) {
    this.number = number;
}

public String getNumber() {
    return number;
}

public void setTitle1(String title1) {
    this.title1 = title1;
}

public String getTitle1() {
    return title1;
}

public void setTitle2(String title2) {
    this.title2 = title2;
}

public String getTitle2() {
    return title2;
}

public void setImageURL(String imageURL) {
    this.imageURL = imageURL;
}

public String getImageURL() {
    return imageURL;
}

回收站接口

String JSONURL = "http://192.168.1.200:5454/api/Goods/";

@GET("?CategoryId=0&PageSize=10&PageNumber=1&Filter=")
Call<String> getString();`

改装适配器

private LayoutInflater inflater;
private ArrayList<ModelRecycler> dataModelArrayList;

public RetrofitAdapter(Context ctx, ArrayList<ModelRecycler> dataModelArrayList){

    inflater = LayoutInflater.from(ctx);
    this.dataModelArrayList = dataModelArrayList;
}

@Override
public RetrofitAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = inflater.inflate(R.layout.retro_item, parent, false);
    MyViewHolder holder = new MyViewHolder(view);

    return holder;
}

@Override
public void onBindViewHolder(RetrofitAdapter.MyViewHolder holder, int position) {

    Picasso.get().load(dataModelArrayList.get(position).getImageURL()).into(holder.image);
    holder.categoryTitle.setText(dataModelArrayList.get(position).getCategoryTitle());
    holder.number.setText(dataModelArrayList.get(position).getNumber());
    holder.title1.setText(dataModelArrayList.get(position).getTitle1());
    holder.title2.setText(dataModelArrayList.get(position).getTitle2());


}

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

class MyViewHolder extends RecyclerView.ViewHolder{

    TextView number, title1, title2,categoryTitle;
    ImageView image;

    public MyViewHolder(View itemView) {
        super(itemView);

        categoryTitle = (TextView) itemView.findViewById(R.id.categoryTitle);
        number = (TextView) itemView.findViewById(R.id.number);
        title1 = (TextView) itemView.findViewById(R.id.title1);
        title2 = (TextView) itemView.findViewById(R.id.title2);
        image = (ImageView) itemView.findViewById(R.id.image);
    }
}

【问题讨论】:

  • 尝试添加adapter.notifyDataSetChanged();
  • 我试过不工作。
  • 那么您需要尝试调试应用程序或查看在 logcat 中打印输出时得到的响应

标签: android json android-recyclerview retrofit


【解决方案1】:

这个 recyclerviewAdapter 显示在你的活动中的 onCreate() 中初始化

 @Override
 protected void onCreate(Bundle savedInstanceState) {

    recyclerView = findViewById(R.id.recycler);
    retrofitAdapter = new RetrofitAdapter(this,modelRecyclerArrayList);
    recyclerView.setAdapter(retrofitAdapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(),  
        LinearLayoutManager.VERTICAL, false));
    }else {
        Toast.makeText(MainActivity.this, obj.optString("message")+"",  
        Toast.LENGTH_SHORT).show();
    }

    //initialize than only fetch the JSON
    fetchJSON();
}

正如@Sam所说,当数据添加到数组列表时,你应该notifyDataSetChanged();

private void onRecycler(String response){

 try {
    //getting the whole json object from the response
    JSONObject obj = new JSONObject(response);
    if(obj.optString("status").equals("200")){

        ArrayList<ModelRecycler> modelRecyclerArrayList = new ArrayList<>();
        JSONArray dataArray  = obj.getJSONArray("data");

        for (int i = 0; i < dataArray.length(); i++) {

            ModelRecycler modelRecycler = new ModelRecycler();
            JSONObject dataobj = dataArray.getJSONObject(i);

            modelRecycler.setImageURL(dataobj.getString("imageURL"));
            modelRecycler.setCategoryTitle(dataobj.getString("categoryTitle"));
            modelRecycler.setNumber(dataobj.getString("number"));
            modelRecycler.setTitle1(dataobj.getString("title1"));
            modelRecycler.setTitle2(dataobj.getString("title2"));

            modelRecyclerArrayList.add(modelRecycler);

        }


     retrofitAdapter.notifyDataSetChanged();  //Add this line here.
  } catch (JSONException e) {
    e.printStackTrace();
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2021-04-01
    • 2019-10-15
    • 1970-01-01
    相关资源
    最近更新 更多