2015年8月25日火曜日

Android RecyclerViewの実装

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

コメントを投稿

Related Posts Plugin for WordPress, Blogger...