来自服务器的数据未显示在屏幕上

时间:2017-03-27 15:46:12

标签: java android retrofit2 rx-java2

所以我正在为我的应用程序使用retrofit和rxjava。所以我正在使用@GET annociation从包含blog_title,blog_content,blog_thumbnail等的服务器中提取我的博客详细信息,所有这些参数都在一个名为blog_post的数组中。 我有我的APIClient:

public class ApiClient {

 private static final String STAGING_BASE_URL = "https://watchnollywood.ml/api/";
 private static ApiClient instance;
 private ApiService apiService;

 private ApiClient(){
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    // set your desired log level
    // TODO: 21/03/2017 when going live change the log level to NONE, to enhance performance
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    // add logging as last interceptor
    httpClient.addInterceptor(logging);  // <-- this is the important line for logging requests!

    final Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
    //final Retrofit retrofit = new Retrofit.Builder().baseUrl(STAGING_BASE_URL).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).addConverterFactory(GsonConverterFactory.create(gson)).client(httpClient.build()).build();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(STAGING_BASE_URL)
            .client(httpClient.build())
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build();
    apiService = retrofit.create(ApiService.class);
}

public static ApiClient getInstance(){
    if(instance == null){
        instance = new ApiClient();

    }
    return instance;
}

//API CALL FOR LOGIN
public Observable<UserItem> login(String email, String password){
    return apiService.signIn(email,password);
}
//API CALL FOR SIGNUP
public Observable<StatusItem> signup(String email, String password, String full_name, String phone){
    return apiService.signUp(email, password,phone,full_name);
}
//API CALL FOR BLOG DETAILS
public Observable<BlogResponse> blog_post(){
    return apiService.blog_post();
 }
 }

ApiService:

public interface ApiService {
@FormUrlEncoded
@POST("signin")
Observable<UserItem> signIn(@Field("email") String email, @Field("password") String password);

@FormUrlEncoded
@POST("signup")
Observable<StatusItem> signUp(@Field("full_name")String full_name, @Field("phone") String phone, @Field("email") String email, @Field("password") String password);


@GET("blog")
Observable<BlogResponse> blog_post();

}

pojo课程:

public class BlogItem {
private int thumbNail;
private String title;
private String summary;

public int getThumbNail() {
    return thumbNail;
}

public void setThumbNail(@DrawableRes int thumbNail) {
    this.thumbNail = thumbNail;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getSummary() {
    return summary;
}

public void setSummary(String summary) {
    this.summary = summary;
}

}

public class BlogResponse {
private BlogItem[] blogItems;

public BlogItem[] getBlogItems() {
    return blogItems;
}

public void setBlogItems(BlogItem[] blogItems) {
    this.blogItems = blogItems;
}
}

我有一个Recyclerview,它将保存将来自服务器的所有信息。但问题是,当我运行它时,我在我的RUN终端得到了一个日志响应,但是在应用程序屏幕上没有显示任何内容。 这是我的FragmentClass,它保存来自服务器的信息: BlogFragment:

public class BlogFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";

private String mParam1;
private RecyclerView recyclerView;
private BlogAdapter adapter;
private List<BlogItem> blogItems;
private View view;


public BlogFragment() {
    // Required empty public constructor
}

public static BlogFragment newInstance(String param1) {
    BlogFragment fragment = new BlogFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_blog, container, false);
    return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    recyclerView = (RecyclerView) view.findViewById(R.id.blog_posts_list);
    setUpViews();
}

private void setUpViews() {
    blogItems = new ArrayList<>();
    adapter = new BlogAdapter(blogItems);
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
    BlogPost();
  //  populateLists();
}

private void BlogPost() {
    ApiClient.getInstance().blog_post().observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.newThread()).subscribe(new DisposableObserver<BlogResponse>() {
        @Override
        public void onNext(BlogResponse value) {
            BlogItem blogItem = new BlogItem();
            blogItem.setTitle(blogItem.getTitle().toString());
            blogItem.setSummary(blogItem.getSummary().toString());

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {
            BlogItem blogItem = new BlogItem();
            blogItem.setTitle("blog_title");
            blogItem.setSummary("blog_content");


        }
    });
    adapter.notifyItemRangeChanged(0, adapter.getItemCount());
}
/*
private void populateLists() {

    int dummyPostArraySize = 10;
    for (int i = 0; i < dummyPostArraySize; i++) {
        BlogItem blogItem = new BlogItem();
        blogItem.setTitle("Post title " + i+1);
        blogItem.setThumbNail(isEven(i) ? R.drawable.profile_image : 0);
        blogItem.setSummary(getString(isEven(i) ? R.string.summary2 : R.string.summary1));
        blogItems.add(blogItem);
    }
    adapter.notifyItemRangeChanged(0, adapter.getItemCount());
}*/
private boolean isEven(int position) {
    return (position & 1) == 0;
}
}

适配器类

public class BlogAdapter extends RecyclerView.Adapter<BlogViewHolder> {
private List<BlogItem> blogItems;

public BlogAdapter(List<BlogItem> blogItems) {
    this.blogItems = blogItems;
}

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

@Override
public void onBindViewHolder(BlogViewHolder holder, int position) {
    BlogItem blogItem = blogItems.get(position);
    holder.bindModel(blogItem);
}

@Override
public int getItemCount() {
    return  blogItems == null ? (0) : blogItems.size();
}
}

查看持有人类

public class BlogViewHolder extends RecyclerView.ViewHolder {
private ImageView cover;
private TextView title;
private TextView summary;

public BlogViewHolder(View itemView) {
    super(itemView);
    cover = (ImageView) itemView.findViewById(R.id.post_thumbnail);
    title = (TextView) itemView.findViewById(R.id.post_title);
    summary = (TextView) itemView.findViewById(R.id.post_summary);
}

public void bindModel(BlogItem blogItem) {
    if (blogItem.getThumbNail() == 0) {
        cover.setVisibility(View.GONE);
    } else {
        cover.setImageResource(blogItem.getThumbNail());
    }
    title.setText(Html.fromHtml(blogItem.getTitle()));
    summary.setText(blogItem.getSummary());
}
}

我做得不对。有人请帮忙!!!

1 个答案:

答案 0 :(得分:0)

private void BlogPost() {方法中,您创建了BlogItem,但之后不做任何事情。您可能忘了将它们添加到blogItems列表中。

此外,该方法中对adapter.notifyItemRangeChanged的调用是在序列接收数据之前发生的,但是在每个blogItem之后或者所有博客项目到达之后都没有调用 - 观察者是完整的与外部BlogPost()方法不同的执行路径。

拼写

编辑

    @Override
    public void onNext(BlogResponse value) {
        for (BlogItem responseItem : value.getBlogItems()) {
            BlogItem blogItem = new BlogItem();
            blogItem.setTitle(responseItem.getTitle().toString());
            blogItem.setSummary(responseItem.getSummary().toString());

            blogItems.add(blogItem);
        }
        adapter.notifyItemRangeChanged(0, adapter.getItemCount());
    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onComplete() {
        BlogItem blogItem = new BlogItem();
        blogItem.setTitle("blog_title");
        blogItem.setSummary("blog_content");

        blogItems.add(blogItem);
        adapter.notifyItemRangeChanged(0, adapter.getItemCount());
    }