Adapter
概要の次にAdapterの話をします。
違う形式?のデータ?の間にあって、それぞれを変換?して
情報を流通される役割です。(私の解釈)
より具体的に書けば、(一覧表示なので)保存されたデータ(トランザクション)を
RecyclerViewで表示する一覧形式に変換します。
From側のデータは、ViewHolderと呼ぶ「入れ物」に格納され、
そこからTo側に提供されます。必ず実装しなければならないメソッドは
下記出典の通りです。(JavaDoc的な説明になります)
(出典 Androidデベロッパー
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);
}
コメント