質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

1706閲覧

RecyclerViewで画面に読み込む数を指定して表示したい

itouuuuuuuuu

総合スコア14

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2017/09/10 20:03

前提・実現したいこと

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiramekun

2017/09/11 22:47

apiからのレスポンスですが、ボタンを押した時は、「追加されるべき要素」のみが返ってきますか?それとも「今までの要素+追加されるべき要素」が返ってきますか?
itouuuuuuuuu

2017/09/14 01:22

apiからは表示すべき全ての要素が配列で一度に返ってきます。mTopicListに全て格納されています。この様な場合は、徐々に表示していく実装は難しいのでしょうか?
guest

回答2

0

AdapterのgetItemCountで返す数字を、
mTopicListのサイズを超えない範囲で
表示したい数を返してやれば何とかならないですかね?

※変更した後、notifyDataSetChanged系メソッド呼ぶのは忘れずに

投稿2017/09/14 05:25

abs123

総合スコア1280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itouuuuuuuuu

2017/09/20 05:59

表示用のListを作成し、表示したい要素をaddしていきnotifyItemInsertedで通知する方法で実現できました notifyDataSetChanged系メソッドの理解が曖昧でしたが、この機会に理解が深まりました ありがとうございます!
guest

0

ベストアンサー

リストを一定数ずつ追加する

要素は
List<Topic> mResult
だと思いますので、これadd等を使って追加すればいいのではないでしょうか

https://developer.android.com/reference/java/util/List.html

投稿2017/09/11 21:21

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itouuuuuuuuu

2017/09/14 01:25

apiからは表示すべき全ての要素が配列で返ってきて、mTopicListには全ての要素が格納されている状態です この様な実装では、期待する動作は難しいのでしょうか
aja

2017/09/14 03:16

全てのデータを別配列に入れて、 表示用のListに追加していけばいいのではないでしょうか この場合は更新をしないとうまくいかないかもしれません あるいは、adapterの中で配列のindexに応じて表示する・表示しないという条件を入れるとか
itouuuuuuuuu

2017/09/20 05:58

表示用のListを作成し、表示したい要素をaddしていきnotifyItemInsertedで通知する方法で実現できました ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問