android - Retrofit 和 RecyclerView 在启动时不显示项目

标签 android android-recyclerview retrofit

在我的应用程序中有 Retrofit 1.9 和 RecyclerView。启动时 HTTP 请求正在发送,我收到数据,但没有显示。在 SwipeRefresh 数据再次下载之后,但在此之前 Recycler 显示的是之前的数据。

fragment :

package com.example.bolek.testy.Fragments;

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.support.v7.widget.DefaultItemAnimator;
import android.widget.Toast;

import com.example.bolek.testy.Adapters.ChaptersAdapter;
import com.example.bolek.testy.Interfaces.WebService;
import com.example.bolek.testy.Pojo.Chapter;
import com.example.bolek.testy.R;

import retrofit.Callback;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.client.Response;

import java.util.ArrayList;
import java.util.List;

public class RetrofitFragment extends Fragment {
    private List<Chapter> chapterList = new ArrayList<>();
    private RecyclerView recyclerView;
    private ChaptersAdapter mAdapter;

    RestAdapter retrofit;
    WebService webService;
    SwipeRefreshLayout refreshLayout;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_retrofit, container, false);
    }

    @Override
    public void onViewCreated(View v, Bundle savedInstanceState) {
        recyclerView = (RecyclerView) v.findViewById(R.id.recycler_view);
        refreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipeRefreshLayout);



        RecyclerView.LayoutManager mLayoutManager;
        int screenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;

        //sprawdzanie rozmiaru ekranu
        switch (screenSize) {
            case Configuration.SCREENLAYOUT_SIZE_SMALL:
                mLayoutManager = new GridLayoutManager(getActivity().getApplicationContext(), 1);
                break;
            case Configuration.SCREENLAYOUT_SIZE_LARGE:
            case Configuration.SCREENLAYOUT_SIZE_XLARGE:
                if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
                    mLayoutManager = new GridLayoutManager(getActivity().getApplicationContext(), 5);
                } else {
                    mLayoutManager = new GridLayoutManager(getActivity().getApplicationContext(), 4);
                }
                break;
            default:
                if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
                    mLayoutManager = new GridLayoutManager(getActivity().getApplicationContext(), 4);
                } else {
                    mLayoutManager = new GridLayoutManager(getActivity().getApplicationContext(), 2);
                }
        }

        mAdapter = new ChaptersAdapter(chapterList, getContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(mAdapter);

        Log.i("aaaaaaaaaaaa", "startup");
        prepareData(true);
        refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                Log.i("aaaaaaaaaaaa", "onRefresh called from SwipeRefreshLayout");
                prepareData(true);
            }
        });
    }

    private void prepareData(final boolean refresh) {

        retrofit = new RestAdapter.Builder()
                .setEndpoint("http://bolex.cba.pl/")
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();
        webService = retrofit.create(WebService.class);

        try {
            webService.getData(new Callback<Chapter[]>() {

                @Override
                public void success(Chapter[] data, Response response) {
                    if (refresh) {
                        chapterList.clear();
                    }

                    for (Chapter item : data) {
                        chapterList.add(item);
                    }
                    refreshLayout.setRefreshing(false);
                }

                @Override
                public void failure(RetrofitError error) {
                    Toast.makeText(getActivity().getApplicationContext(), error.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
                    Log.d("Rest", error.getLocalizedMessage());
                }
            });
        } catch (Exception e) {
            Log.d("Rest", e.toString());
        }
        mAdapter.notifyDataSetChanged();
    }
}

适配器:

package com.example.bolek.testy.Adapters;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;

import java.util.List;

import com.example.bolek.testy.Pojo.Chapter;
import com.example.bolek.testy.R;

public class ChaptersAdapter extends RecyclerView.Adapter<ChaptersAdapter.MyViewHolder> {
    private List<Chapter> chapterList;
    private Context mContext;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView date, number, title;
        private ImageView cover;

        public MyViewHolder(View view) {
            super(view);
            date = (TextView) view.findViewById(R.id.date);
            cover = (ImageView) view.findViewById(R.id.cover);
            number = (TextView) view.findViewById(R.id.number);
            title = (TextView) view.findViewById(R.id.title);
        }
    }

    public ChaptersAdapter(List<Chapter> chapterList, Context mContext) {
        this.chapterList = chapterList;
        this.mContext = mContext;
    }

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

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Chapter chapter = chapterList.get(position);
        holder.title.setText(chapter.getTitle());
        if(chapter.getDate() == null){
            Log.d("aaaaaaaaaaaaaaaaaaaaa","null");
        }
        Glide.with(mContext).load("https://novelki.pl/uploads/"+chapter.getImage())
                .thumbnail(0.5f)
                .error(R.drawable.no_foto)
                .crossFade()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(holder.cover);
        holder.date.setText(chapter.getDate());
        holder.number.setText("Tom " + chapter.getTomNumber() + " chapter " + chapter.getChapterNumber());
    }

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

有什么想法吗?

附言 抱歉我的英语不好。

最佳答案

我认为当数据到来时你可能没有更新你的适配器:

private void prepareData(final boolean refresh) {
    @Override
    public void success(Chapter[] data, Response response) {
        retrofit = new RestAdapter.Builder()
                .setEndpoint("http://bolex.cba.pl/")
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();
        webService = retrofit.create(WebService.class);

        try {
            webService.getData(new Callback<Chapter[]>() {

                @Override
                public void success(Chapter[] data, Response response) {
                    if (refresh) {
                        chapterList.clear();
                    }

                    for (Chapter item : data) {
                        chapterList.add(item);
                    }
                    // I JUST ADDED THIS LINE BELOW
                    mAdapter.notifyDataSetChanged();
                    refreshLayout.setRefreshing(false);
                }
         ...
     }

关于android - Retrofit 和 RecyclerView 在启动时不显示项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41643358/

相关文章:

java - 改造库的post方法错误

java - 改造解析 JSON 响应空值 Android

在 Java 中改造 protobuf-lite 转换器

java - android ArrayList在getter方法之后为空

java - 在 aspx 表单中查找直接链接或使用 android 读取表单

android - 在回收站 ListView 项目之间添加了大空间

android - Navigation.createNavigateOnClickListener 来自 onBindViewHolder?

android - java.lang.InternalError 线程在运行时关闭期间启动

android - 基于 API 级别请求权限

android - 为 GridLayoutManager 设置完整跨度