Adapterの話

Adapter

概要の次にAdapterの話をします。

違う形式?のデータ?の間にあって、それぞれを変換?して

情報を流通される役割です。(私の解釈)

より具体的に書けば、(一覧表示なので)保存されたデータ(トランザクション)を

RecyclerViewで表示する一覧形式に変換します。

From側のデータは、ViewHolderと呼ぶ「入れ物」に格納され、

そこからTo側に提供されます。必ず実装しなければならないメソッドは

下記出典の通りです。(JavaDoc的な説明になります)

(出典 Androidデベロッパー 

RecyclerView で動的リストを作成する  |  Android デベロッパー  |  Android Developers

1)onCreateViewHolder(): RecyclerView は、新しい ViewHolder を作成する必要があるたびにこのメソッドを呼び出します。このメソッドは、ViewHolder とそれに関連する View を作成して初期化しますが、ビューのコンテンツは埋めません(ViewHolder はこの時点で特定のデータにバインドされていません)。

 (私的解釈)

  •  ViewHolderに関連するviewを生成して、そのViewHolderを返却します。上記でも述べられていますが、特定のデータとの関連は(この時点では)していません。
  • (表示する)レイアウト XML ファイルを対応するView オブジェクトにインスタンス化します。
  • viewオブジェクトを生成するために、標準的にはinflateメソッドを使用しますが、そのメソッドを取得するために、指定されたコンテキストから LayoutInflater を取得し、inflateを呼び出します。
  • 今回の例では、LayoutInflater.from(parent.getContext())を使って、更にinflate(R.layout.fragment_item, parent, false)として、関連付けてます。

(コーディン例)

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_item, parent, false);

ちなみにinflateする画面定義(fragment_item)は次の通りです。

AndroidStudioの全体概要図の左下の画面(赤の短冊(テーブル))です。

コーディング例は以下です。

<!– –>

<!–このXMLはRecycleViewで表示する1行のレイアウトでデータを表示する定義–>

<!– 表示用 一行 レイアウト–>

<!—->

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”

   xmlns:tools=”http://schemas.android.com/tools”

   android:layout_width=”match_parent”

   android:layout_height=”wrap_content”

   android:background=”@drawable/border”

   android:orientation=”vertical”

   android:padding=”8dp”>

   <!– データを表示するテーブルレイアウト –>

   <TableLayout

       android:layout_width=”match_parent”

       android:layout_height=”90dp”

       android:stretchColumns=”*”

       tools:ignore=”Suspicious0dp”>

       <!– テーブルの各データ行の定義 –>

       <TableRow>

           <!– 1 –>

           <TextView

               android:id=”@+id/renban”

               android:padding=”3dip” />

           <!– 2 –>

           <TextView

               android:id=”@+id/koneORotto”

               android:padding=”3dip” />

           <!– click point –>

           <TextView

               android:id=”@+id/my_text_view”

               android:layout_width=”wrap_content”

               android:layout_height=”wrap_content”

               android:text=”>>”

               android:textStyle=”bold” />

       </TableRow>

       <TableRow>

           <!– 3 –>

           <TextView android:id=”@+id/hizuke” />

           <!–                android:padding=”3dip” />–>

       </TableRow>

       <TableRow>

           <!– 4 –>

           <TextView android:id=”@+id/jikoku” />

           <!–                android:padding=”3dip” />–>

       </TableRow>

       <TableRow>

           <!– 5 –>

           <TextView android:id=”@+id/dare” />

           <!–                android:padding=”3dip” />–>

           <!– 6 –>

           <TextView android:id=”@+id/nani” />

           <!–                android:padding=”3dip” />–>

           <!– 7 –>

           <TextView android:id=”@+id/shurui” />

           <!–            android:padding=”3dip” />–>

       </TableRow>

       <TableRow>

           <!– 8 –>

           <TextView android:id=”@+id/hosoku” />

       </TableRow>

   </TableLayout>

</LinearLayout>

更に、当然ですがRecycleViewを示すXMLも必要です。

コーディング例を示します。

<?xml version=”1.0″ encoding=”utf-8″?><!– –>

<!– リスト表示をする部分(RecycleView)を定義する–>

<!–    tools:listitem=”@layout/fragment_item” />–>

<!– リスト表示部分(RecyclerView) –>

<androidx.recyclerview.widget.RecyclerView xmlns:android=”http://schemas.android.com/apk/res/android”

   xmlns:app=”http://schemas.android.com/apk/res-auto”

   xmlns:tools=”http://schemas.android.com/tools”

   android:id=”@+id/list”

   android:name=”com.example.konechanlog.ItemFragment”

   android:layout_width=”match_parent”

   android:layout_height=”match_parent”

   android:layout_marginLeft=”16dp”

   android:layout_marginRight=”16dp”

   app:layoutManager=”androidx.recyclerview.widget.LinearLayoutManager”

   tools:context=”.ItemFragment”

   tools:listitem=”@layout/fragment_item”>

</androidx.recyclerview.widget.RecyclerView>

2)onBindViewHolder(): RecyclerView はこのメソッドを呼び出して、ViewHolder をデータに関連付けます。このメソッドは適切なデータを取得し、そのデータを使用してビューホルダーのレイアウトを埋めます。たとえば、RecyclerView が名前のリストを表示する場合、このメソッドはリストの中から適切な名前を見つけて、ビューホルダーの TextView ウィジェットを埋めます。

(私的解釈)

● メソッドで得たViewHolderにデータ(ここでは「ある1行」)を関連付けます。

● onCreateViewHolderメソッドで生成されたViewHolder(の1行分を)関連付けします。

● ViewHolderの属性一つ一つにデータを関連付けします。

● 当たり前ですが、表示するXML(onCreateViewHolderでのviewオブジェクト生成時の表示形式)とViewHolderの属性とは1対1に関連が必要です。

(コーディング例)

PlaceholderItem t = mValues.get(position);

(ここではPlaceholderオブジェクトという1行分のオブジェクトを別途定義して、ここのデータの取出しをまとめています。

そのため、別途Placeholder生成を行う必要があります。

mValuesはPlaceholderオブジェクトの集合です)

int x = position + 1;

holder.mRenban.setText(Integer.toString(x));

3)getItemCount(): RecyclerView はこのメソッドを呼び出して、データセットのサイズを取得します。たとえば、アドレス帳アプリの場合、このデータセットのサイズは住所の合計数になります。RecyclerView はこの情報を使用して、表示できるアイテムがほかにないかどうかを判断します。

全体を纏めるコーディング例は次の通りです。

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View view =     LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_item, parent, false);

return new ViewHolder(view);

}

public void onBindViewHolder(final ViewHolder holder, int position) {

   PlaceholderItem t = mValues.get(position);

   int x = position + 1;

   holder.mRenban.setText(Integer.toString(x));

public int getItemCount() {

   return mValues.size();

}

(ViewHolder例)

public ViewHolder(@NonNull View itemView) {

   super(itemView);

   mRenban = itemView.findViewById(R.id.renban);

   mKoneORotto = itemView.findViewById(R.id.koneORotto);  // こね

   mHizuke = itemView.findViewById(R.id.hizuke);  //日付

   mJikoku = itemView.findViewById(R.id.jikoku);  // 時刻

   mDare = itemView.findViewById(R.id.dare);  // 誰

   mNani = itemView.findViewById(R.id.nani);  // 何

   mShurui = itemView.findViewById(R.id.shurui);  // 種類

   mHosoku = itemView.findViewById(R.id.hosoku);  // 種類

   myTextView = itemView.findViewById(R.id.my_text_view);

}

Comments

タイトルとURLをコピーしました