ごみ箱
RecyclerViewは、いくつかのパフォーマンスの改善と新機能を備えたListViewの拡張バージョンです。 名前が示すように、RecyclerViewはスクロール時にアイテムビューをリサイクルまたは再利用します。 RecyclerViewは、ListViewと比較してアニメーションの追加がはるかに簡単です。 このチュートリアルでは、タイトル、フッター、ページネーション、アニメーションを使用してRecyclerViewを作成する方法について説明します。
グラドル設定
build.gradleファイルに次の依存関係を追加します。
//, compile 'com.android.support:recyclerview-v7:23.1.1'
RecyclerViewをXMLビューに追加する
プロジェクトを同期した後、RecyclerViewコンポーネントをレイアウトに追加します。
<android.support.v7.widget.RecyclerView android:id="@+id/recycleView" android:clipToPadding="false" android:padding="8dp" android:layout_height="match_parent" android:layout_width="match_parent"/>
JAVAクラスを使用したXMLバインディング
アクティビティのonCreateメソッドに次のコードを追加します。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setcontentview mRecyclerView = (RecyclerView) findViewById(R.id.recycleView); // true, RecyclerView mRecyclerView.setHasFixedSize(false); // LayoutManager mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); // RecyclerView mAdapter = new MyAdapter(mList); mRecyclerView.setAdapter(mAdapter); }
先に進む前に、上記のコードを詳しく見てみましょう
- レイアウトマネージャー -簡単に言えば、 レイアウトマネージャーは、RecyclerViewの構造を定義するのに役立ちます。 3つの組み込みレイアウトマネージャーがあります。 さらに、要件を満たすために独自のカスタムレイアウトマネージャーを作成できます。
- LinearLayoutManagerは、垂直または水平スクロールでリストにアイテムを表示します。
- GridLayoutManagerは、グリッド内のアイテムを表示します。
- StaggeredGridLayoutManagerは、チェッカーボードにアイテムを表示します。
- setHasFixedSize -RecyclerViewの高さまたは幅を変更しない場合はtrueに設定します 。
- RecyclerViewアダプター -RecyclerViewには、パディングおよびアイテム管理アダプターが必要です。 ここで、値を持つArrayListをAdapterに渡します。 アダプタの詳細な説明は次のセクションにあります。
RecyclerView ItemDecoration
ItemDecorationを使用すると、アプリケーションは特別なバンドとオフセットをアダプターデータセットのアイテムの特定の表現に追加できます。 これは、要素、選択、視覚的なグループ化の境界などの間にセパレータを描くのに役立ちます。 -developer.android.com
この例では、ItemDecorationを使用して各アイテムにパディングを追加します。
public class ItemOffsetDecoration extends RecyclerView.ItemDecoration { private int offset; public ItemOffsetDecoration(int offset) { this.offset = offset; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { // if (parent.getChildAdapterPosition(view) == 0) { outRect.right = offset; outRect.left = offset; outRect.top = offset; outRect.bottom = offset; } } } }
上記のクラスでは、null要素をインデントします。
// onCreate RecyclerView // , 20 mRecyclerView.addItemDecoration(new ItemOffsetDecoration(20));
RecyclerViewアダプター
次に、ヘッダーとフッターを使用してReeyclerViewアダプターを構成しましょう。
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final int TYPE_HEADER = 0; private static final int TYPE_ITEM = 1; private static final int TYPE_FOOTER = 2; ArrayList<String> mList = new ArrayList<>(); public MyAdapter(ArrayList<String> mList) { this.mList = mList; } @Override public int getItemViewType(int position) { if (isPositionHeader(position)) { return TYPE_HEADER; } else if (isPositionFooter(position)) { return TYPE_FOOTER; } return TYPE_ITEM; } private boolean isPositionHeader(int position) { return position == 0; } private boolean isPositionFooter(int position) { return position > mList.size(); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { if (viewType == TYPE_ITEM) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_layout, viewGroup, false); return new ItemViewHolder(view); } else if (viewType == TYPE_HEADER) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.header_layout, viewGroup, false); return new HeaderViewHolder(view); } else if (viewType == TYPE_FOOTER) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.footer_layout, viewGroup, false); return new FooterViewHolder(view); } throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly"); } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { if (holder instanceof HeaderViewHolder) { // , . ((HeaderViewHolder) holder).txtName.setText(mList.get(position)) // }else if (holder instanceof ItemViewHolder) { // }else if (holder instanceof FooterViewHolder) { // } } @Override public int getItemCount() { // return this.mList.size() + 2; } // ViewHolders , class HeaderViewHolder extends RecyclerView.ViewHolder { public View View; private final TextView txtName; public HeaderViewHolder(View itemView) { super(itemView); View = itemView; // ui , txtName = (TextView) View.findViewById(R.id.txt_name); } } public class ItemViewHolder extends RecyclerView.ViewHolder { public View View; public ViewHolder(View v) { super(v); View = v; // . } } public class FooterViewHolder extends RecyclerView.ViewHolder { public View View; public ViewHolder(View v) { super(v); View = v; // . } } }
ページネーション
アダプターの準備ができたので、RecyclerViewリストにページネーションを追加する方法を見てみましょう。 これは非常に簡単で、AdapterをRecycler-Viewにインストールした後にonCreateに追加する必要があります。
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); int lastvisibleitemposition = mLayoutManager.findLastVisibleItemPosition(); if (lastvisibleitemposition == mAdapter.getItemCount() - 1) { if (!loading && !isLastPage) { loading = true; fetchData((++pageCount)); // 1 pagecount // make loading = false // mAdapter.notifyDataSetChanged (), } } } });
mListでデータが変更されるたびに、以下の関数を呼び出してRecyclerViewアダプターを更新し、新しいデータを表示します。
mAdapter.notifyDataSetChanged();
この投稿が、タイトル、フッター、ページネーションを含むRecyclerViewの設定に関する一般的なアイデアを得るのに役立つことを願っています。