前提・実現したいこと
Retrofitを用いてサーバーから配列形式のjsonを受け取り、RecyclerViewでリスト状(StaggeredGridLayout)に表示しています。
この時、一度にすべての内容を表示するのではなく、「更に読み込み」のようなボタンを実装し、ボタンが押される度に一定数ずつリストを表示していきたいと考えています。
例えば、全体で20項目のリストの場合、
初期表示 5項目
↓
「更に読み込み」ボタンをクリック
↓
10項目表示
↓
「更に読み込み」ボタンをクリック
↓
15項目表示
↓
「更に読み込み」ボタンをクリック
↓
20項目表示
のような動きにしたいと考えています。
要望
一定数ずつリストを作成するという部分の処理がわからず、質問させていただきました。
ボタン追加やクリック時の処理は実装できるので、リストを一定数ずつ追加するという処理部分についてアドバイスいただけたらと思います。
よろしくお願いいたします。
コード
Adapter
java
1public class TopicsRecyclerAdapter extends RecyclerView.Adapter<TopicsRecyclerAdapter.ViewHolder> { 2 3 private List<Topic> mTopicList = new ArrayList<>(); 4 private Context mContext; 5 6 // ViewHolder 7 class ViewHolder extends RecyclerView.ViewHolder { 8 9 @BindView(R.id.topicImage) ImageView mTopicImage; 10 @BindView(R.id.topicTitle) TextView mTopicTitle; 11 12 // ViewHolderのコンストラクタ 13 private ViewHolder(View v) { 14 super(v); 15 16 // ButterKnifeのバインド 17 ButterKnife.bind(this, v); 18 } 19 } 20 21 // コンストラクタ 22 public TopicsRecyclerAdapter (Context context, List<Topic> topicList) { 23 mTopicList = topicList; 24 mContext = context; 25 } 26 27 // ViewHolder作成 28 @Override 29 public TopicsRecyclerAdapter.ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { 30 final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_topics, parent, false); 31 32 // ViewHolder作成 33 final TopicsRecyclerAdapter.ViewHolder holder = new TopicsRecyclerAdapter.ViewHolder(view); 34 35 return holder; 36 } 37 38 // 画面に表示する内容をセット 39 @Override 40 public void onBindViewHolder(TopicsRecyclerAdapter.ViewHolder holder, int position) { 41 42 // 商品内容をViewHolderにセット 43 Picasso.with(mContext).load(mTopicList.get(position) // 記事画像 44 .getImageInfoUrl()) 45 .into(holder.mTopicImage); 46 holder.mTopicTitle.setText(mTopicList.get(position).getTitle()); // 記事タイトル 47 } 48 49 @Override 50 public int getItemCount() { 51 return mTopicList.size(); 52 } 53}
Fragment
java
1public class TopicsFragment extends Fragment { 2 3 private ApiInterface mApiInterface; 4 private Call<List<Topic>> mCall; 5 private Unbinder mUnbinder; 6 private List<Topic> mResult; 7 @BindView(R.id.topicsRecyclerView) RecyclerView mTopicsRecyclerView; 8 9 // コンストラクタ 10 public TopicsFragment() { } 11 12 public static TopicsFragment newInstance() { 13 TopicsFragment fragment = new TopicsFragment(); 14 return fragment; 15 } 16 17 @Override 18 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 19 20 // viewの取得 21 final View view = inflater.inflate(R.layout.fragment_topics, container, false); 22 23 // ButterKnifeのバインド 24 mUnbinder = ButterKnife.bind(this, view); 25 26 // Retrofitの設定 27 Retrofit retrofit = new Retrofit.Builder() 28 .baseUrl(ApiInterface.END_POINT) // エンドポイント 29 .addConverterFactory(GsonConverterFactory.create()) // json変換方法(gsonを使用に設定) 30 .build(); 31 mApiInterface = retrofit.create(ApiInterface.class); 32 33 // API呼び出し 34 mCall = mApiInterface.getTopics(); 35 36 // 非同期でAPIサーバーからリストに情報を読み込む 37 mCall.enqueue(loadFromApiToList); 38 39 return view; 40 } 41 42 private Callback<List<Topic>> loadFromApiToList = new Callback<List<Topic>>() { 43 @Override 44 public void onResponse(Call<List<Topic>> call, Response<List<Topic>> response) { 45 if (response.isSuccessful()) { 46 mResult = response.body(); 47 48 // 2列のStaggeredGridLayoutで表示 49 mTopicsRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); 50 51 // アダプターを作成 52 TopicsRecyclerAdapter adapter = new TopicsRecyclerAdapter(getContext(), mResult); 53 54 // アダプターをセット 55 mTopicsRecyclerView.setAdapter(adapter); 56 } 57 } 58 59 @Override 60 public void onFailure(Call<List<Topic>> call, Throwable t) { 61 Log.d(TAG, "onFailure: " + t.getCause() + ", " + t.getMessage()); 62 t.printStackTrace(); 63 } 64 }; 65 66 @Override 67 public void onDestroyView() { 68 super.onDestroyView(); 69 mUnbinder.unbind(); 70 } 71}
回答2件
あなたの回答
tips
プレビュー