android v 7互換パッケージRecyclerViewの使用(二)


前回android v 7互換パッケージRecyclerViewの使用(一)RecyclerViewの最も基本的な使い方を述べましたが、今からもっと詳しい内容を掘り起こします.RecyclerViewのAPIで、こんな言葉がありました
A flexible view for providing a limited window into a large data set.
つまり、限られたサイズのウィンドウに大量のデータが表示されている場合、RecyclerViewはこのような状況を解決する柔軟なViewです.
以上の説明から、RecyclerViewの使用シーンがわかります.同じタイプのデータが大量に画面に表示されている場合、すべてのデータが画面全体に完全に表示されない可能性があります.この場合、RecyclerViewは適切な選択です.ユーザが画面を上下にスクロールすると、itemのリサイクルも同時に行われ、新しいitemが可視範囲に入ると、必然的に古いitemが可視範囲から移動し、この移動されたitemもリサイクルされる.では、itemを再利用するのにどのような役割があるのでしょうか.実は、CPUリソースとメモリを節約するため、彼はとても役に立つ方法です.
私たちがListViewを使うのに長い時間がかかったと言うかもしれませんが、RecyclerViewは私たちの以前の方法と何か特別なところがありましたか.昔、listviewを使っていたとき、リサイクルや他のものにはある程度の結合性があり、今ではRecyclerViewではより柔軟な方法を提供しています.
Googleが現在使用しているこの方法は、RecyclerViewが見ているものを気にしないし、要素が正しい場所に表示されているかどうかも気にしないし、各要素がどのように区切られているかも気にしない.RecyclerViewがやっていることはリサイクルだけです.そのため、RecyclerViewと呼ばれています.
以下に、RecyclerViewに関連する最も重要なクラスをいくつか示します.
Adapter:アダプタ、バインドデータセットViewHolder:現在のデータに基づいてビューを保存するLayoutManager:レイアウトマネージャ.itemがどのように配置するかを決定するItemDecoration:無理にitem装飾器と理解し、item ItemAnimator:アニメーションを美化することができ、1つのitemが追加されたり、削除されたり、再配置されたりすると、アニメーション効果があります.
ViewHolder
Androidの公式は、ある程度効率を大幅に向上させ、インタフェースのスムーズ性を高めることができるため、ViewHolderモードの使用を長い間推奨しています.RecyclerViewのアダプタは内部クラスであり、それを継承することでサブクラスを拡張します.
public final static class ListItemViewHolder extends RecyclerView.ViewHolder {
   TextView title;//item        
   TextView description;//item        
   //            
   public ListItemViewHolder(View itemView) {
      super(itemView);
      //    
      title= (TextView) itemView.findViewById(R.id.title);
      description= (TextView) itemView.findViewById(R.id.description);
   }
}

RecyclerView.Adapter
アダプタは、基礎データセットと単一itemレイアウトとのつながりを確立する2つの主要な機能を完了します.アダプタはAndroidの重要な部分の一つです.ListView、AutoCompleteTextView、Spinnerなど、多くの場所でアダプタが使用されています.
Googleは従来のAdapterの代わりにRecyclerViewの内部クラスAdapterを使用しているので、RecyclerViewではSimpleCursorAdapter、ArrayAdapterのようなアダプタは見られません.
残念なことにグーグルはRecyclerViewを提供していません.Adapterのデフォルト実装クラスは抽象クラスなので、3つの方法を実装する必要があります.
public VH onCreateViewHolder(ViewGroup parent, int viewType) public void onBindViewHolder(VH holder, int position) public int getItemCount()
VHはViewHolderから継承された汎用型であり、サブクラスに特定のタイプを指定する必要があります.基本的なアダプタの書き方は以下の通りです.
public class RecyclerViewAdapter extends RecyclerView.Adapter <RecyclerViewAdapter.ItemViewHolder> {

    private List<DemoModel> items;

    RecyclerViewAdapter(List<DemoModel> modelData) {
        if (modelData == null) {
            throw new IllegalArgumentException(
                  "modelData must not be null");
        }
        this.items = modelData;
    }

    @Override
    public ItemViewHolder onCreateViewHolder(
            ViewGroup viewGroup, int viewType) {
        View itemView = LayoutInflater.
                from(viewGroup.getContext()).
                inflate(R.layout.item,viewGroup,false);
        return new ItemViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(
            ItemViewHolder viewHolder, int position) {
        DemoModel model = items.get(position);
        viewHolder.title.setText(model.getTitle());
        viewHolder.description.setText(model.getDescription());
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    public final static class ItemViewHolder extends RecyclerView.ViewHolder {
        // ... shown above in the ViewHolder section
    }
}

RecyclerView.LayoutManager
レイアウトマネージャはRecyclerViewの最も興味深い場所であり、すべてのサブitemのレイアウトを担当しています.最新のv 7互換ライブラリでは、LinearLayoutManager(リニアレイアウト)、GridLayoutManager(aグリッドレイアウト)、StaggeredGridLayoutManager(ストリーミングレイアウト)の3つの実装クラスがあります.デフォルトでは、レイアウトマネージャを設定しない場合は、リニアレイアウトを使用します.このクラスを継承することで、独自のレイアウトマネージャを実装し、itemの内容をどのように配置するかを自分で決めることができますが、上記の3つの実装クラスのコードを見てみると、これがどんなに容易ではないかがわかります.コードが長いですね...本当に!レイアウトマネージャの具体的な使用方法については、リニアレイアウトマネージャの簡単な使用について説明します.コードは次のとおりです.
//     
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
//         
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//      
layoutManager.scrollToPosition(currPos);
//       
recyclerView.setLayoutManager(layoutManager);

RecyclerView.ItemDecoration
一応itemアクセサリーと呼んで、ItemDecorationを使ってitemにオフセット量を増やしたり、item分割線を増やしたり、ハイライトしたりすることができます.私たちは多くのItemDecorationを追加することができます.RecyclerViewはすべてのItemDecorationを順次巡回し、描画方法を呼び出して装飾を完了します.3つの抽象的な方法があります
public void onDraw(Canvas c, RecyclerView parent) public void onDrawOver(Canvas c, RecyclerView parent) public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent)
onDrawで描いたコンテンツはitemのコンテンツによって遮られる可能性がありますが、onDrawOverで描いたコンテンツはitemの上に描かれます.オフセット量を使用してitemを簡単に分割できますが、分割線を表示したい場合はonDrawOverメソッドを使用して分割線を明示的に描画する必要があります.
レイアウトマネージャは、測定フェーズでgetItemOffsetメソッドを呼び出します.RectタイプのパラメータとoutRectパラメータは少し変に見えますが、なぜ戻り値を使わないのでしょうか.グーグルがこのようにした以上、意味があるに違いありません.これにより、すべてのitemが1つのRectオブジェクトを多重化することができるので、リソースを節約できます.これは必ずしも最良ではありませんが、確かに効率的にリソースを節約することができます.
注意すべき点は、onDraw()/onDrawOver()メソッドはitemごとに呼び出されず、すべてのitemの装飾内容を描くために呼び出されるだけです.したがって,この方法ではすべてのitemを巡回して描画しなければならない.
前の記事では、DividerItemDecorationのソースコードを簡単に提供しました.もちろん、ItemDecorationを継承することで、より豊富なコンテンツを実現することができます.
RecyclerView.ItemAnimator
ItemAnimatorクラスは主にアニメーション効果を処理し、以下の3つの場合、このアニメーションがトリガーされます.
  • データセット
  • にitemが追加される
  • itemがデータセットから
  • 削除される
  • インタフェースにおける位置が
  • 移動する.
    幸いなことに、v 7互換パッケージにはDefaultItemAnimatorというデフォルトの実装クラスが用意されています.設定しないと、デフォルトはクラスに適応します.
    アニメーションを有効にするには、androidがデータの変更を知らなければならないことは明らかです.以前のアダプタでは、androidデータセットが変更されたことをnotifyDataSetChangedメソッドを呼び出して通知する必要がありました.しかし、この方法は適用されなくなりました.この方法では、すべての可視itemが再描画されますが、アニメーションはトリガーされません.アニメーションをトリガーするには、次のような方法を呼び出さなければなりません.
    public final void notifyItemInserted(int position) public final void notifyItemRemoved(int position)
    Listeners
    Listener、RecyclerViewにはOnItemClickListenerとOnItemLongClickListenerがありませんが、OnItemTouchListenerを使用してジェスチャーを合わせてこれらのイベントを識別することができます.これは、同じ効果を実現するためにより多くのコードを作成する必要があることを意味します.
    以上述べたように
    レイアウトファイルで使用するコードは次のとおりです.
         <android.support.v7.widget.RecyclerView  android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" tools:listitem="@layout/item_demo_01" />

    toolsアトリビュートは現在のレイアウトをレンダリングし、ビジュアル化エディタに切り替えると効果が表示されます.もちろん書かなくてもいいですが、効果は表示されません.
    特定のプロパティは使用されていませんが、実際にはRecyclerViewのプロパティは親のViewGroupから来ています.RecyclerViewでは、generateLayoutParamsというAttributeSetを使用していますが、内部ではあまり属性を操作していません.
    @Override
    public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
       if (mLayout == null) {
          throw new IllegalStateException("RecyclerView has no LayoutManager");
       }
       return mLayout.generateLayoutParams(getContext(), attrs);
    }

    Activityで使うのも簡単です
    //      
    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    
    //                ,     
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    layoutManager.scrollToPosition(0);
    recyclerView.setLayoutManager(layoutManager);
    
    //  item          ,             。。
    recyclerView.setHasFixedSize(true);
    
    //            
    List<DemoModel> items = new ArratList<DemoModel>();
    //......            
    adapter = new RecyclerViewDemoAdapter(items);
    recyclerView.setAdapter(adapter);
    
    //     ,               
    RecyclerView.ItemDecoration itemDecoration =
            new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST);
    //     add   set,        
    recyclerView.addItemDecoration(itemDecoration);
    
    //          ,          ; 
    //          ,       
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    
    //      ,      
    //recyclerView.addOnItemTouchListener(this);
    

    以下のステップにまとめる
  • RecyclerView参照
  • を取得
  • レイアウトマネージャを作成し、RecyclerViewに
  • を追加
  • アダプタを作成し、RecyclerViewに
  • を追加
  • 必要なら
  • ItemAnimatorを作成し、必要であれば
  • は、0から複数のListenerを作成し、RecyclerViewの
  • に追加します.
    基本的なソースコードは前の文章と同じで、ソースコードは住所をダウンロードしますhttp://download.csdn.net/detail/sbsujjbcy/8489667
    この文章は参考にしたhttp://www.grokkingandroid.com/first-glance-androids-recyclerview/