ルームデータベース.Refererviewパート2



導入
  • このシリーズは、Androidルームライブラリの基礎に捧げられる予定です.私は、公式Googleガイドに続きます.HERE しかし、私は私により意味をなす命令で働きます.

  • すぐれた言葉
  • このポストは、私の最後のポストの続きパート2です.そして、我々が部屋データベースで使用するためにどのように我々がリサイクル・ビューをセットアップするかについて説明します.このポストは、アダプターをセットアップして、我々のRefererviewを上へ、そして、走らせることに捧げられます.

  • アダプタ
  • アダプタとViewHowever(前の投稿から)一緒に私たちのデータがどのように見えるかを定義する単語.
  • ViewHolderは、動的リスト内の個々の項目のレイアウトを含むビューのラッパーです.
  • アダプタは、それらが必要とされるときにViewHowageオブジェクトを作成します.また、これらのオブジェクトのデータも設定します.オブジェクトをそれらのデータに関連づけるプロセスは、結合と呼ばれています.
  • 「普通の」アダプターを作成するとき、我々は3つの主要なメソッドを上書きする必要があります
  • 1 ) OnCreateView (): ResererViewは新しいビューを作成する必要があるときはいつでも、このメソッドを呼び出します.このメソッドは、ViewHowageとその関連付けられたビューを作成して初期化しますが、ビューの内容には入力されません.したがって、このメソッドはViewWholdオブジェクトを作成するために使用されますが、データをバインドしません.
    2 ) OnBindView (): RefererViewこのメソッドを呼び出して、ViewHolderとデータを関連付ける.このメソッドは適切なデータを取得し、ビューホルダーのレイアウトを埋めるデータを使用します.このメソッドは、データをViewHowoldオブジェクトにバインドするために使用します.
    3 ) getItemCount () : ResererViewこのメソッドを呼び出してデータセットのサイズを取得します.
  • それで、現在、我々は実装するアダプターを見ます.
  • public class WordListAdapter extends ListAdapter<Word,WordViewHolder> {
    
        public WordListAdapter(DiffUtil.ItemCallback<Word> diffCallback) {
            super(diffCallback);
        }
    
        @Override
        public WordViewHolder onCreateViewHolder( ViewGroup parent, int viewType) {
            return WordViewHolder.create(parent);
        }
    
        @Override
        public void onBindViewHolder( WordViewHolder holder, int position) {
            Word current = getItem(position);
            holder.bind(current.getWord());
    
        }
    
        public static class WordDiff extends DiffUtil.ItemCallback<Word> {
            @Override
            public boolean areItemsTheSame(Word oldItem,Word newItem){
                return oldItem == newItem;
            }
    
            @Override
            public boolean areContentsTheSame(Word oldItem,Word newItem){
                return oldItem.getWord().equals(newItem.getWord());
            }
        }
    }
    

    ListAdapterとは
  • 最初に気づいたのは、アダプタのサブクラスを使っていることですListAdapter . アダプターのこの特別な種類は、リストを更新するのに役立ちます.用途Eugene W. Myer's Diffingアルゴリズムは何を更新するかを決定する.それは非常に効率的です.

  • getItemCount ()はどこですか?
  • おそらく、getItemCount ()を実装しなかったことに気付きました.このメソッドの実装を行うListAdapterを使用しているので、これを行うことができます.
  • この構文があなたに混乱しているならばListAdapter<Word,WordViewHolder>それから、私たちは少しジェネリックを再利用する必要がありますbounded type parameters .
  • あなたがジェネリックと有界なタイプパラメタにすでに慣れているならば、この次のセクションをスキップするために自由に感じてください.

  • ジェネリック
  • それで、ジェネリックについて話すとき、我々は最初に自分自身に尋ねる必要があります.さて、ジェネリックにはいくつかの利点がありますが、メインの型はより強力な型チェックです.
  • タイプチェック:ジェネリックは、コンパイル時にコードをより強い型チェックを行います.これはコンパイル時エラーに変換することによって多くのランタイムエラーを消去するので、これは重要です.コンパイル時のエラーは識別子により簡単になり、ランタイムエラーを修正します.

    ジェネリッククラスの作成
  • ジェネリッククラスは以下の構文で定義されます:
  • class name<T1,T2,T3....>{
      //Typical member fields
    }
    
  • The <>diamond そして、それは型を保持するために使用されます.資本においてT はクラスの宣言中に型パラメーターを表現するために使用されます.
  • ListAdapterのドキュメントを見ると、以下のようにジェネリックを使用することがわかります.
  • ListAdapter<T, VH extends RecyclerView.ViewHolder>
  • 我々が以前言及したように、我々はそれを知っていますT は宣言中に型を表現するために使用されますが、heckはVH extends RecyclerView.ViewHolder ? 我々が最初に学ぶ必要があることを理解するためによくbounded type parameters .

  • 有界型パラメータ
  • ジェネリッククラスまたはメソッド内で型パラメーターとして使用できる型を制限する場合があります.これが何bounded type parameters できるようにしなさい.
  • 制限された型パラメーターを宣言するには、型パラメーターの名前を一覧表示しますupper bounds . 上限はどのように我々が許容されるクラスのタイプを決定するかです.有界型パラメータは次のようになります<U extends Number>
  • この制限された型パラメーターは、型番号とそのサブクラスの型を受け入れるだけです.型番号はupper bounds
  • ListAdapterのドキュメントに学んだことを適用しました.次のことがわかります.
  • ListAdapter<T, VH extends RecyclerView.ViewHolder>
    
  • 私たちのListAdapterは任意の型(T)とViewHoweverのいずれかのViewHolderまたはサブクラスの型を受け入れます.この実装では、以下のようにListAdapterを使用します.
  • ListAdapter<Word,WordViewHolder>
    
  • 以来WordViewHolder ListAdapterが使用する制限された型パラメーターによって受け入れられます.

  • パブリック静的クラスworddiff拡張子utilを拡張します.ItemCallback
  • これを説明することができるために、我々は最初に話をしなければなりませんDiffUtil . Diffutilは2つのリストの違いを計算し、最初のリストを2番目のリストに変換する更新演算子のリストを出力するユーティリティクラスです.
  • 拡散はEugene W. Myer's 別の1つのリストに変換する更新プログラムの最小数を計算するためのアルゴリズムを拡散.

  • 何がdiffutilです.iTemkCall ?
  • これは、リスト内の2つの非NULL項目の違いを計算するのに使われるTelutilの内部の静的抽象入れ子クラスです.次に、2つのメソッドを実装しなければなりません:
  • 1 ) areitemsthesame (): 2つの項目が同じデータかどうかをチェックするために呼び出されます.
    2 ) arecontentsameame (): 2つのオブジェクトが同じ項目を表すかどうかを確認するために呼び出されます.

    RefererViewの実装
  • 今、我々はメインアクティビティに移動し、このコードの下に貼り付けなければならないsetContentView() メソッド.
  • RecyclerView recyclerView = findViewById(R.id.recyclerview);
            final WordListAdapter adapter = new WordListAdapter(new WordListAdapter.WordDiff());
    
            recyclerView.setAdapter(adapter);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
    

    RefererViewのリサイクルビュー
  • これは、後で私たちは、アダプタとレイアウトマネージャを設定することができますので、私たちのリサイクルErrorViewへの参照を取得しています.

  • 新しいwordlistAdapter =新しいwordlistAdapter (新しいwordlistadapter . worddiff () )
  • これは、アダプタのインスタンスを作成することです.我々のListAdapterは、Diffingアルゴリズムに使用されるクラスを必要としますWordListAdapter.WordDiff() .

  • リサイクルsetAdapter (アダプター);
  • setAdapter(adapter) どのように、我々はReaderViewの我々のインスタンスにアダプターを設定しますか.

  • リサイクルsetLayoutManager (新しいリニアレイアウトマネージャ(これ));
  • これはレイアウトマネージャを設定するために必要です.this は、リニアレイアウトマネージャが必要とするコンテキストとして使用されます.活動に取り組むときthis アクティビティコンテキストを表します.線形レイアウトマネージャは、我々のデータを線形ファッションで表示します.

  • アプリケーションの起動
  • 最後に、我々はすべてが動作していることを確認するために我々のアプリケーションを実行するためにそれを行う必要があります.今のところ、我々はすべての空白の画面です.アプリがクラッシュしない限り、我々はコードの作業を検討することができます.

  • 結論
  • 私のこのブログ記事を読むためにあなたの日の時間を割いていただきありがとうございます.あなたが質問または懸念があるならば、下でコメントしてください、さもなければ、私に連絡してください.