AndroidのGridLayoutManagerの例を示します。

AndroidのGridLayoutManagerは、アイテムをグリッド形式で配置するためのRecyclerView.LayoutManagerの実装です。このチュートリアルでは、CardViewをRecyclerView内にGridLayout形式で表示するアプリケーションを作成します。また、RecyclerViewのアイテムをListViewのitemClickListenerに似たクリック動作にするためのインターフェースも実装します。

アンドロイドのGridLayoutManager

ここではLinearLayoutManagerを使用してRecyclerViewを実装しました。さあ、GridLayoutManagerを使用してRecyclerViewをグリッドとしてレイアウトしましょう。以下はGridLayoutManagerのコンストラクタです。

GridLayoutManager (Context context, 
                int spanCount, 
                int orientation, 
                boolean reverseLayout)

reverseLayoutがtrueに設定されている場合、レイアウトは終わりから始めてアイテムを配置します。各アイテムのスパンサイズを設定するために、GridLayoutManagerのsetSpanSizeLookupメソッドを呼び出します。新しいAndroid Studioプロジェクトで、GridLayoutManagerを使用してRecyclerViewを実装しましょう。

以下は、AndroidのGridLayoutManagerの例となるプロジェクトの構造です。

以下の文章を日本語でパラフレーズしてください。選択肢は1つだけ必要です:
プロジェクトは、MainActivity.java(単一のアクティビティ)、RecyclerViewAdapter.java(アダプタークラス)、DataModel.java(データモデルクラス)、AutoFitGridLayoutManager.java(カスタムのGridLayoutManagerクラス)で構成されています。MainActivity.javaクラスのxmlレイアウトは、activity_main.xmlファイルで定義されています。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    </RelativeLayout>

</android.support.design.widget.CoordinatorLayout>

注意:build.gradleファイルにMaterial DesignウィジェットとCardViewのための以下の依存関係を追加することを忘れないでください。

compile 'com.android.support:cardview-v7:25.1.1'
compile 'com.android.support:design:25.1.1'

以下はDataModel.javaクラスです:package com.scdev.recyclerviewgridlayoutmanager;

public class DataModel {

    public String text;
    public int drawable;
    public String color;

    public DataModel(String t, int d, String c )
    {
        text=t;
        drawable=d;
        color=c;
    }
}

The DataModelクラスでは、各アイテムセルのテキスト、描画可能なアイコン、および背景色を保持します。下記にはRecyclerViewAdapter.javaクラスがあります。

package com.scdev.recyclerviewgridlayoutmanager;

import android.content.Context;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.ArrayList;


public class RecyclerViewAdapter extends RecyclerView.Adapter {

    ArrayList mValues;
    Context mContext;
    protected ItemListener mListener;

    public RecyclerViewAdapter(Context context, ArrayList values, ItemListener itemListener) {

        mValues = values;
        mContext = context;
        mListener=itemListener;
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public TextView textView;
        public ImageView imageView;
        public RelativeLayout relativeLayout;
        DataModel item;

        public ViewHolder(View v) {

            super(v);

            v.setOnClickListener(this);
            textView = (TextView) v.findViewById(R.id.textView);
            imageView = (ImageView) v.findViewById(R.id.imageView);
            relativeLayout = (RelativeLayout) v.findViewById(R.id.relativeLayout);

        }

        public void setData(DataModel item) {
            this.item = item;

            textView.setText(item.text);
            imageView.setImageResource(item.drawable);
            relativeLayout.setBackgroundColor(Color.parseColor(item.color));

        }


        @Override
        public void onClick(View view) {
            if (mListener != null) {
                mListener.onItemClick(item);
            }
        }
    }

    @Override
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(mContext).inflate(R.layout.recycler_view_item, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder Vholder, int position) {
        Vholder.setData(mValues.get(position));

    }

    @Override
    public int getItemCount() {

        return mValues.size();
    }

    public interface ItemListener {
        void onItemClick(DataModel item);
    }
}

上記のコードでは、MainActivity.javaクラスに実装されるItemListenerインターフェースを定義しています。各RecyclerViewアイテムのためのxmlレイアウトは以下の通りです。recycler_view_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:card_view="https://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <android.support.v7.widget.CardView
        android:id="@+id/cardView"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        card_view:cardCornerRadius="0dp"
        card_view:cardElevation="@dimen/margin10"
        card_view:cardMaxElevation="@dimen/margin10"
        card_view:contentPadding="@dimen/margin10">


        <RelativeLayout
            android:id="@+id/relativeLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_gravity="center">

            <ImageView
                android:id="@+id/imageView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:tint="@android:color/white"
                android:padding="5dp" />


            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:textColor="@android:color/white"
                android:layout_below="@+id/imageView" />


        </RelativeLayout>

    </android.support.v7.widget.CardView>

</LinearLayout>

以下にAutoFitGridLayoutManager.javaクラスが記載されています。

package com.scdev.recyclerviewgridlayoutmanager;

import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;

public class AutoFitGridLayoutManager extends GridLayoutManager {

    private int columnWidth;
    private boolean columnWidthChanged = true;

    public AutoFitGridLayoutManager(Context context, int columnWidth) {
        super(context, 1);

        setColumnWidth(columnWidth);
    }

    public void setColumnWidth(int newColumnWidth) {
        if (newColumnWidth > 0 && newColumnWidth != columnWidth) {
            columnWidth = newColumnWidth;
            columnWidthChanged = true;
        }
    }

    @Override
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
        if (columnWidthChanged && columnWidth > 0) {
            int totalSpace;
            if (getOrientation() == VERTICAL) {
                totalSpace = getWidth() - getPaddingRight() - getPaddingLeft();
            } else {
                totalSpace = getHeight() - getPaddingTop() - getPaddingBottom();
            }
            int spanCount = Math.max(1, totalSpace / columnWidth);
            setSpanCount(spanCount);
            columnWidthChanged = false;
        }
        super.onLayoutChildren(recycler, state);
    }
}

次の文を日本語で表現すると、次のようになります:

スパン数は、利用可能な方向、幅、高さに基づいて動的に計算されます。また、以下にMainActivity.javaクラスが記載されています。

package com.scdev.recyclerviewgridlayoutmanager;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements RecyclerViewAdapter.ItemListener {

    RecyclerView recyclerView;
    ArrayList arrayList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        arrayList = new ArrayList();
        arrayList.add(new DataModel("Item 1", R.drawable.battle, "#09A9FF"));
        arrayList.add(new DataModel("Item 2", R.drawable.beer, "#3E51B1"));
        arrayList.add(new DataModel("Item 3", R.drawable.ferrari, "#673BB7"));
        arrayList.add(new DataModel("Item 4", R.drawable.jetpack_joyride, "#4BAA50"));
        arrayList.add(new DataModel("Item 5", R.drawable.three_d, "#F94336"));
        arrayList.add(new DataModel("Item 6", R.drawable.terraria, "#0A9B88"));

        RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, arrayList, this);
        recyclerView.setAdapter(adapter);


        /**
         AutoFitGridLayoutManager that auto fits the cells by the column width defined.
         **/

        /*AutoFitGridLayoutManager layoutManager = new AutoFitGridLayoutManager(this, 500);
        recyclerView.setLayoutManager(layoutManager);*/


        /**
         Simple GridLayoutManager that spans two columns
         **/
        GridLayoutManager manager = new GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(manager);
    }

    @Override
    public void onItemClick(DataModel item) {

        Toast.makeText(getApplicationContext(), item.text + " is clicked", Toast.LENGTH_SHORT).show();

    }
}

    1. 上記のクラスは、インターフェースRecyclerViewAdapter.ItemListenerを実装し、アダプタークラスで定義されているonItemClickメソッドをオーバーライドしています。これにより、ListViewのために定義されている標準のonItemClickListenerと同様に、アクティビティ内でRecyclerViewのクリックリスナーを実装しています。

 

    1. DataModelクラスは、各RecyclerViewアイテムの詳細を保持しています。

 

    RecyclerViewのLayoutManagerは、500と設定された列幅を持つAutoFitGridLayoutManagerクラスをインスタンス化するか、GridLayoutManagerクラスオブジェクトを呼び出して列数を2に設定することで定義することができます。

標準のGridLayoutManagerコードを使用して、アプリケーションの出力を確認しましょう。ご覧のように、各行には両方の方向で列幅を占める2つのアイテムがあります。次に、シンプルなGridLayoutManagerのコードをコメントアウトして、AutoFitGridLayoutManagerのコードを実行してください。

AutoFitGridLayoutManager layoutManager = new AutoFitGridLayoutManager(this, 500);
recyclerView.setLayoutManager(layoutManager);

アプリケーションの動作結果は、以下に示します。 上記の出力では、画面の向きが横に変わると、各行に3つのアイテムがあり、アイテムは列の幅に応じて自動的にサイズ調整されます。これでチュートリアルは終了です。最終的なAndroidのGridLayoutManagerプロジェクトは、以下のリンクからダウンロードできます。

アンドロイドのGridLayoutManagerプロジェクトをダウンロードしてください。

コメントを残す 0

Your email address will not be published. Required fields are marked *


广告
広告は10秒後に閉じます。
bannerAds