2017-01-13 7 views
1

В моем приложении есть Retrofit 1.9 и RecyclerView. При запуске HTTP-запрос отправляет и я получаю данные, но не отображаются. После того, как данные SwipeRefresh будут загружены повторно, но до этого Recycler отображает предыдущие данные.Retrofit и RecyclerView не отображает элементы при запуске

Фрагмент:

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

Любая идея?

P.S. Извините за мой плохой английский.

ответ

1

Я думаю, вы не могли бы вы обновление адаптера, когда приходят данные:

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); 
       } 
     ... 
    } 
+0

Он работает. Благодарю. У меня была эта линия, но в конце. –

+0

Я знаю, что у вас это было в конце. Проблема заключалась в том, что «конец» произошел раньше, так как вы используете асинхронный обратный вызов. –