- 公開日:2015年08月25日
- 最終更新日:2016年04月05日
記事概要
AndroidでRecyclerViewの実装方法を記載した記事です
RecyclerViewでの区切り線の表示の仕方はこの記事を参考にしてください。
RecyclerViewでViewを切り替える実装方法はこの記事を参考にしてください。
gitのサンプルコード付きの、より詳細な記事を記述しました。
環境
- Android Studio 1.3.0
- OS X Yosemite
- android sdk 23(Android 6.0 Marshmallow(マシュマロ))
gradleの設定
まずはRecyclerViewを利用できるようにgradleの設定を行ないます。
android sdkは23.0(Android 6.0 Marshmallow(マシュマロ))を利用します。
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.0" defaultConfig { minSdkVersion 15 targetSdkVersion 23 } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:recyclerview-v7:23.0.0' }
compile 'com.android.support:recyclerview-v7:23.0.0'でRecyclerViewを利用できるように設定しています。
RecyclerViewの実装
続いてRecyclerViewを実装します。Fragmentに実装します。
まずはxmlです。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:id="@+id/test_relative" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" > <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout> </FrameLayout>
android.support.v7.widget.RecyclerViewはRelativeLayoutの子にするのがコツです。RecyclerViewは、親で利用できないので注意してください。
続いてFragmentを実装します。
public class TestFragment extends Fragment { private OnFragmentInteractionListener mListener; protected RecyclerView mRecyclerView; protected RecyclerView.LayoutManager mLayoutManager; protected TestAdapter mAdapter; protected List<TestItem> mDataset; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initDataset(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_test, container, false); mRecyclerView = (RecyclerView)view.findViewById(R.id.recyclerView); // use this setting to improve performance if you know that changes // in content do not change the layout size of the RecyclerView mRecyclerView.setHasFixedSize(true); // use a linear layout manager mLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(mLayoutManager); mAdapter = new TestAdapter(mDataset); // Set TestAdapter as the adapter for RecyclerView. mRecyclerView.setAdapter(mAdapter); // END_INCLUDE(initializeRecyclerView) return view; } private void initDataset() { mDataset = new ArrayList<TestItem>(); for (int i = 0; i < 10; i++) { TestItem testItem = new TestItem(); testItem.time = "" + i; mDataset.add(testItem); } } }
通常のListFragmentと同じでAdapterを実装する必要があります。
続いてAdapterを実装します。
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> { private static final String TAG = "TestAdapter"; private List<TestItem> mDataSet; // BEGIN_INCLUDE(recyclerViewSampleViewHolder) /** * Provide a reference to the type of views that you are using (custom ViewHolder) */ public static class ViewHolder extends RecyclerView.ViewHolder { private final TextView textView; private final ImageView imageView; public ViewHolder(View v) { super(v); // Define click listener for the ViewHolder's View. v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "Element " + getPosition() + " clicked."); } }); textView = (TextView) v.findViewById(R.id.textView); imageView = (ImageView) v.findViewById(R.id.imageView); } public TextView getTextView() { return textView; } public ImageView getImageView() { return imageView; } } // END_INCLUDE(recyclerViewSampleViewHolder) /** * Initialize the dataset of the Adapter. * * @param dataSet String[] containing the data to populate views to be used by RecyclerView. */ public TestAdapter(List<TestItem> dataSet) { mDataSet = dataSet; } // BEGIN_INCLUDE(recyclerViewOnCreateViewHolder) // Create new views (invoked by the layout manager) @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { // Create a new view. View v = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.test_row_item, viewGroup, false); return new ViewHolder(v); } // END_INCLUDE(recyclerViewOnCreateViewHolder) // BEGIN_INCLUDE(recyclerViewOnBindViewHolder) // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(ViewHolder viewHolder, final int position) { Log.d(TAG, "Element " + position + " set."); // Get element from your dataset at this position and replace the contents of the view // with that element TestItem testItem = mDataSet.get(position); viewHolder.getTimeView().setText(testItem.time); viewHolder.getWeatherView().setImageResource(R.mipmap.ic_launcher); } // END_INCLUDE(recyclerViewOnBindViewHolder) // Return the size of your dataset (invoked by the layout manager) @Override public int getItemCount() { return mDataSet.size(); } }
ViewHolderパターンを使って、viewを使いまわしています。
あとはビルドをすればRecyclerViewを使った一覧画面が表示されます。
まとめ
Android 6.0 Marshmallow(マシュマロ)のリリースでrecyclerview-v7も23.0.0まであがり、昔のFragmentListを使う理由はないように思いました。
今後アプリを作成、修正する場合はリスト画面にはRecyclerViewを積極的に利用したいですね。
以上
Androidアプリ開発にオススメの本
開発にあると便利なオススメ製品
関連記事 参考サイト
0 件のコメント:
コメントを投稿