BRVAH使用マニュアル

19679 ワード

公式サイト:www.recyclerview.org
BRVAHは強力なRecyclerAdapterフレームワーク(RecyclerViewとは何ですか?)で、開発者の開発時間を大幅に節約し、ほとんどのリストの一般的なニーズソリューションを統合します.
文書ディレクトリ
  • フレームワーク導入
  • Adapterコードを元のadapterと比較して最適化し、コード量を70%削減します.
  • ItemイベントItemを追加するクリックイベントItemの長押イベントItemサブコントロールのクリックイベントItemサブコントロールの長押イベント
  • リストを追加アニメーションをロードする1行のコードは、5つのデフォルトアニメーションを簡単に切り替えます.
  • ヘッド、テールの1行のコードを追加して終わり、またListView時代に戻ったような気がします.
  • 自動ロードアップロードスライドイベントをリスニングする必要はなく、ロードレイアウトをカスタマイズし、異常プロンプトを表示し、異常プロンプトをカスタマイズできます.ドロップダウンロードもサポートされています.
  • パケットレイアウトは、パケットヘッダを任意に定義する.
  • マルチレイアウトのシンプルな構成で、追加の方法を書き換える必要はありません.
  • は、ListviewのsetEmptyViewよりも空のレイアウトを設定します.
  • ドラッグ、スライド削除を追加してオンにします.リスニングは簡単です.
  • ツリーリストはExpandableListViewよりも強力で、マルチレベルをサポートしています.
  • カスタムViewHolderはカスタムViewHolderをサポートし、開発者が好きなようにします.
  • 拡張フレームワークサードパーティフレームワークを組み合わせて、より多くのニーズのカスタマイズを容易に実現します.

  • フレーム導入
    まずbuild.gradle(Project:XXXX)のrepositories追加:
    allprojects {
        repositories {
            ...
            maven { url "https://jitpack.io" }
        }
    }
    

    そしてbuild.gradle(Module:app)のdependencies追加:
       dependencies {
                compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46'
        }
    

    Adapterの使用
        adapter  ,  70%    。
    

    コードの使用
    public class HomeAdapter extends BaseQuickAdapter {
        public HomeAdapter(int layoutResId, List data) {
            super(layoutResId, data);
        }
    
        @Override
        protected void convert(BaseViewHolder helper, HomeItem item) {
            helper.setText(R.id.text, item.getTitle());
            helper.setImageResource(R.id.icon, item.getImageResource());
            //       
          Glide.with(mContext).load(item.getUserAvatar()).crossFade().into((ImageView) helper.getView(R.id.iv));
        }
    }
    

    まずBaseQuickAdapterを継承する必要があり、次にBaseQuickAdapterの最初の汎用Statusがデータエンティティタイプであり、2番目のBaseViewHolderがViewHolderであり、拡張ViewHolderをサポートすることを目的としています.
    割り当ては、viewHolderオブジェクトポイント関連メソッドを直接使用してviewIdとデータを転送することで行い、チェーン呼び出しをサポートします.ネットワーク画像やカスタムビューをロードする場合はviewHolderを使用します.getView(viewId)は、このコントロールを取得します.
    一般的な方法
  • viewHolder.getLayoutPosition()現在のitemのposition
  • を取得
    Itemイベントの追加
    Itemのクリックイベント
    adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                    Log.d(TAG, "onItemClick: ");
                    Toast.makeText(ItemClickActivity.this, "onItemClick" + position, Toast.LENGTH_SHORT).show();
                }
            });
    

    Itemの長押しイベント
    adapter.setOnItemLongClickListener(new BaseQuickAdapter.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
                    Log.d(TAG, "onItemLongClick: ");
                    Toast.makeText(ItemClickActivity.this, "onItemLongClick" + position, Toast.LENGTH_SHORT).show();
                    return false;
                }
            });
    

    注意:recycleViewをネストする場合はadapterを使用する必要があります.recycleViewを使用する場合はクリックイベントを設定します.addOnItemTouchListenerは累計で追加されます.
    ItemサブコントロールのクリックイベントはまずadapterのconvertメソッドでviewHolderを通過する.addOnClickListenerバインドされたコントロールid
     @Override
        protected void convert(BaseViewHolder viewHolder, Status item) {
            viewHolder.setText(R.id.tweetName, item.getUserName())
                    .setText(R.id.tweetText, item.getText())
                    .setText(R.id.tweetDate, item.getCreatedAt())
                    .setVisible(R.id.tweetRT, item.isRetweet())
                    .addOnClickListener(R.id.tweetAvatar)
                    .addOnClickListener(R.id.tweetName)
                    .linkify(R.id.tweetText);
           
        }
    

    設定
     adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
                @Override
                public boolean onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
                    Log.d(TAG, "onItemChildClick: ");
                    Toast.makeText(ItemClickActivity.this, "onItemChildClick" + position, Toast.LENGTH_SHORT).show();
                    return false;
                }
            });
    

    adapterでのバインド方法addOnClickListenerをaddOnLongClickListenerに変更する.クリックイベントの設定方法setOnItemChildClickListenerをsetOnItemChildLongClickListenerに変更注意:サブコントロールを設定するイベントは、adapterにバインドされていないと、設定するコントロールが見つからないため、クリックイベントは有効になりません.クリックイベントで他のサブコントロールを取得する必要がある場合は、次の操作を行います.
    getViewByPosition(RecyclerView recyclerView, int position, @IdRes int viewId) 
    

    注意:ヘッダーがある場合はpositionとheaderlayoutcountを処理する必要があります.
    リストを追加してアニメーションをロード
    アニメーション(既定はグラデーション)adapterをオンにします.openLoadAnimation(); 既定では5つの方法があります(グラデーション、スケール、下から上、左から右、右から左)
    public static final int ALPHAIN = 0x00000001;
        /**
         * Use with {@link #openLoadAnimation}
         */
        public static final int SCALEIN = 0x00000002;
        /**
         * Use with {@link #openLoadAnimation}
         */
        public static final int SLIDEIN_BOTTOM = 0x00000003;
        /**
         * Use with {@link #openLoadAnimation}
         */
        public static final int SLIDEIN_LEFT = 0x00000004;
        /**
         * Use with {@link #openLoadAnimation}
         */
        public static final int SLIDEIN_RIGHT = 0x00000005;
    

    アニメーションの切り替え
    quickAdapter.openLoadAnimation(BaseQuickAdapter.ALPHAIN);
    

    カスタムアニメーション
    quickAdapter.openLoadAnimation(new BaseAnimation() {
                                @Override
                                public Animator[] getAnimators(View view) {
                                    return new Animator[]{
                                            ObjectAnimator.ofFloat(view, "scaleY", 1, 1.1f, 1),
                                            ObjectAnimator.ofFloat(view, "scaleX", 1, 1.1f, 1)
                                    };
                                }
                            });
    

    アニメーションのデフォルトは1回のみ実行されます.繰り返し実行する場合は設定できます.
    mQuickAdapter.isFirstOnly(false);
    

    アニメーション数を表示しない設定
    adapter.setNotDoAnimationCount(count);
    

    最初のインタフェースのitemは、アニメーションのロードを順次実行します.
    インタフェースに入るitemは多くの速度で入ってくるのでスライド表示の順にアニメーションを実行することはありませんが、このとき一緒にアニメーションを実行します.このような効果が悪いと思ったらsetNotDoAnimationCountを使って第1画面itemを設定してアニメーションを実行しないようにしてもいいですが、順にアニメーションを実行する必要がある場合はstartAnimを書き直して最初の画面のitemアニメーションを遅延させて実行すればいいです.
    @Override
        protected void startAnim(Animator anim, int index) {
            super.startAnim(anim, index);
            if (index < count)
            anim.setStartDelay(index * 150);
        }
    

    頭部、末尾を追加
    追加
    mQuickAdapter.addHeaderView(getView());
    mQuickAdapter.addFooterView(getView());
    

    指定ビューの削除
    mQuickAdapter.removeHeaderView(getView);
    mQuickAdapter.removeFooterView(getView);
    

    すべて削除
    mQuickAdapter.removeAllHeaderView();
    mQuickAdapter.removeAllFooterView();
    

    デフォルトでは、ヘッダーが表示されてもEmptyと末尾は表示されません.
    setHeaderAndEmpty
    setHeaderFooterEmpty
    

    デフォルトのヘッダーの末尾は1行で満たされています.必要に応じて満たされないように構成できます.
    setHeaderViewAsFlow
    setFooterViewAsFlow
    

    自動ロード
    アップロード//最後のItemをスライドしたときのコールバックonLoadMoreRequestedメソッド
    setOnLoadMoreListener(RequestLoadMoreListener);
    

    デフォルトの最初のロードはコールバックに入ります.必要でない場合は、次のように構成できます.
    mQuickAdapter.disableLoadMoreIfNotFullPage();
    

    コールバック処理コード
    mQuickAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
                @Override public void onLoadMoreRequested() {
                    mRecyclerView.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            if (mCurrentCounter >= TOTAL_COUNTER) {
                                //        
                                mQuickAdapter.loadMoreEnd();
                            } else {
                                if (isErr) {
                                    //        
                                    mQuickAdapter.addData(DataServer.getSampleData(PAGE_SIZE));
                                    mCurrentCounter = mQuickAdapter.getData().size();
                                    mQuickAdapter.loadMoreComplete();
                                } else {
                                    //        
                                    isErr = true;
                                    Toast.makeText(PullToRefreshUseActivity.this, R.string.network_err, Toast.LENGTH_LONG).show();
                                    mQuickAdapter.loadMoreFail();
                                }
                            }
                        }
                    }, delayMillis);
                }
            }, mReyclerView);
    

    ロード完了(ロード終了ではなく、今回のデータロードが終了し、次のページのデータもあることに注意)
    mQuickAdapter.loadMoreComplete();
    

    ロード失敗
    mQuickAdapter.loadMoreFail();
    

    ロード終了
    mQuickAdapter.loadMoreEnd();
    

    ロードをオンまたはオフにします(一般的には、ドロップダウンを同時に操作できないため、ドロップダウンするときに処理されます).
    mQuickAdapter.setEnableLoadMore(boolean);
    

    プリロード//リストが最後からN番目のItemにスライドしたとき(デフォルトは1)コールバックonLoadMoreRequestedメソッド
    mQuickAdapter.setPreLoadNumber(int);
    

    カスタムロードレイアウトの設定
    mQuickAdapter.setLoadMoreView(new CustomLoadMoreView());
    
    public final class CustomLoadMoreView extends LoadMoreView {
    
        @Override public int getLayoutId() {
            return R.layout.view_load_more;
        }
    
        /**
         *     true,                
         *     false,            getLoadEndViewId()  
         */
        @Override public boolean isLoadEndGone() {
            return true;
        }
    
        @Override protected int getLoadingViewId() {
            return R.id.load_more_loading_view;
        }
    
        @Override protected int getLoadFailViewId() {
            return R.id.load_more_load_fail_view;
        }
    
        /**
         * isLoadEndGone() true,    0
         * isLoadEndGone() false,    0
         */
        @Override protected int getLoadEndViewId() {
            return 0;
        }
    }
    

    レイアウトファイル
    
    
    
    
    
        
    
        
    
    
     
    
        
      
      
    
    

    ドロップダウン・ロード(チャット・ソフトウェアのドロップダウン履歴データの要件に適合)設定オン・スイッチ
     mAdapter.setUpFetchEnable(true);
    

    リスニングの設定
    mAdapter.setUpFetchListener(new BaseQuickAdapter.UpFetchListener() {
                @Override
                public void onUpFetch() {
                    startUpFetch();
                }
            });
    
    private void startUpFetch() {
            count++;
            /**
             * set fetching on when start network request.
             */
            mAdapter.setUpFetching(true);
            /**
             * get data from internet.
             */
            mRecyclerView.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mAdapter.addData(0, genData());
                    /**
                     * set fetching off when network request ends.
                     */
                    mAdapter.setUpFetching(false);
                    /**
                     * set fetch enable false when you don't need anymore.
                     */
                    if (count > 5) {
                        mAdapter.setUpFetchEnable(false);
                    }
                }
            }, 300);
        }
    

    ロード開始位置
    mAdapter.setStartUpFetchPosition(2);
    

    グループレイアウト
    エンティティクラスはSectionEntityを継承する必要があります
    public class MySection extends SectionEntity

    adapter構造は2つのレイアウトidを入力する必要があります.1つ目はitemで、2つ目はheadで、convertメソッドにitemデータをロードし、convertHeadメソッドにheadデータをロードします.
    public class SectionAdapter extends BaseSectionQuickAdapter {
         public SectionAdapter(int layoutResId, int sectionHeadResId, List data) {
            super(layoutResId, sectionHeadResId, data);
        }
        @Override
        protected void convert(BaseViewHolder helper, MySection item) {
            helper.setImageUrl(R.id.iv, (String) item.t);
        }
        @Override
        protected void convertHead(BaseViewHolder helper,final MySection item) {
            helper.setText(R.id.header, item.header);
           
            helper.setOnClickListener(R.id.more, new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context,item.header+"more..",Toast.LENGTH_LONG).show();
                }
            });
        }
    

    マルチレイアウト
    エンティティクラスはMultiItemEntityを実装する必要があります.データを設定する際には、各データにitemTypeを設定する必要があります.
    public class MultipleItem implements MultiItemEntity {
        public static final int TEXT = 1;
        public static final int IMG = 2;
        private int itemType;
    
        public MultipleItem(int itemType) {
            this.itemType = itemType;
        }
    
        @Override
        public int getItemType() {
            return itemType;
        }
    }
    

    構造の中でaddItemTypeはtypeとlayoutの関係をバインドします
    public class MultipleItemQuickAdapter extends BaseMultiItemQuickAdapter {
    
        public MultipleItemQuickAdapter(List data) {
            super(data);
            addItemType(MultipleItem.TEXT, R.layout.text_view);
            addItemType(MultipleItem.IMG, R.layout.image_view);
        }
    
        @Override
        protected void convert(BaseViewHolder helper, MultipleItem item) {
            switch (helper.getItemViewType()) {
                case MultipleItem.TEXT:
                    helper.setImageUrl(R.id.tv, item.getContent());
                    break;
                case MultipleItem.IMG:
                    helper.setImageUrl(R.id.iv, item.getContent());
                    break;
            }
        }
    }
    

    GridLayoutManagerでitemを多重化する問題を考慮して、次のように構成できます.
      multipleItemAdapter.setSpanSizeLookup(new BaseQuickAdapter.SpanSizeLookup() {
                @Override
                public int getSpanSize(GridLayoutManager gridLayoutManager, int position) {
                    return data.get(position).getSpanSize();
                }
            });
    

    空のレイアウトの設定
    //               
    mQuickAdapter.setEmptyView(getView());
    

    ドラッグ、スライド削除の追加
    ドラッグ&スライド削除のコールバック方法
    OnItemDragListener onItemDragListener = new OnItemDragListener() {
        @Override
        public void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos){}
        @Override
        public void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) {}
        @Override
        public void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {}
    }
    
    OnItemSwipeListener onItemSwipeListener = new OnItemSwipeListener() {
        @Override
        public void onItemSwipeStart(RecyclerView.ViewHolder viewHolder, int pos) {}
        @Override
        public void clearView(RecyclerView.ViewHolder viewHolder, int pos) {}
        @Override
        public void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) {}
    };
    

    adapterはBaseItemDraggableAdapterを継承する必要があります
    public class ItemDragAdapter extends BaseItemDraggableAdapter {
        public ItemDragAdapter(List data) {
            super(R.layout.item_draggable_view, data);
        }
    
        @Override
        protected void convert(BaseViewHolder helper, String item) {
            helper.setText(R.id.tv, item);
        }
    }
    

    Activity使用コード
    mAdapter = new ItemDragAdapter(mData);
    
    ItemDragAndSwipeCallback itemDragAndSwipeCallback = new ItemDragAndSwipeCallback(mAdapter);
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragAndSwipeCallback);
    itemTouchHelper.attachToRecyclerView(mRecyclerView);
    
    //     
    mAdapter.enableDragItem(itemTouchHelper, R.id.textView, true);
    mAdapter.setOnItemDragListener(onItemDragListener);
    
    //       
    mAdapter.enableSwipeItem();
    mAdapter.setOnItemSwipeListener(onItemSwipeListener);
    

    デフォルトでは、開発者が必要とする場合、複数の異なるViewタイプ間のドラッグはサポートされていません.
    ItemDragAndSwipeCallbackのonMove()メソッドを書き換えると、return trueになります.
    ツリーリスト
    例:三級メニュー
    // if you don't want to extent a class, you can also use the interface IExpandable.
    // AbstractExpandableItem is just a helper class.
    public class Level0Item extends AbstractExpandableItem {...}
    public class Level1Item extends AbstractExpandableItem {...}
    public class Person {...}
    

    adapterはBaseMultiItemQuickAdapterを継承する必要があります
    public class ExpandableItemAdapter extends BaseMultiItemQuickAdapter { 
        public ExpandableItemAdapter(List data) {    
            super(data);
            addItemType(TYPE_LEVEL_0, R.layout.item_expandable_lv0);   
            addItemType(TYPE_LEVEL_1, R.layout.item_expandable_lv1);    
            addItemType(TYPE_PERSON, R.layout.item_text_view);
        }
        @Override
        protected void convert(final BaseViewHolder holder, final MultiItemEntity item) {
            switch (holder.getItemViewType()) {
            case TYPE_LEVEL_0:
                ....
                //set view content
               holder.itemView.setOnClickListener(new View.OnClickListener() {
                   @Override
                   public void onClick(View v) {
                       int pos = holder.getAdapterPosition();
                       if (lv0.isExpanded()) { 
                           collapse(pos);
                       } else {
                           expand(pos);
                       }
               }});
               break;
            case TYPE_LEVEL_1:
               // similar with level 0
               break;
            case TYPE_PERSON:
               //just set the content
               break;
        }
    }
    

    すべてのメニューを開きます.
    adapter.expandAll();
    

    あるitemを削除します(追加と修正の考え方は同じです)
    //         
     int cp = getParentPosition(person);
    //           list,      
     ((Level1Item)getData().get(cp)).removeSubItem(person);
    //             
     getData().remove(holder.getLayoutPosition());
    //     
     notifyDataSetChanged();