- 公開日: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 件のコメント:
コメントを投稿