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追加:
そしてbuild.gradle(Module:app)のdependencies追加:
Adapterの使用
コードの使用
まずBaseQuickAdapterを継承する必要があり、次にBaseQuickAdapterの最初の汎用Statusがデータエンティティタイプであり、2番目のBaseViewHolderがViewHolderであり、拡張ViewHolderをサポートすることを目的としています.
割り当ては、viewHolderオブジェクトポイント関連メソッドを直接使用してviewIdとデータを転送することで行い、チェーン呼び出しをサポートします.ネットワーク画像やカスタムビューをロードする場合はviewHolderを使用します.getView(viewId)は、このコントロールを取得します.
一般的な方法 viewHolder.getLayoutPosition()現在のitemのposition を取得
Itemイベントの追加
Itemのクリックイベント
Itemの長押しイベント
注意:recycleViewをネストする場合はadapterを使用する必要があります.recycleViewを使用する場合はクリックイベントを設定します.addOnItemTouchListenerは累計で追加されます.
ItemサブコントロールのクリックイベントはまずadapterのconvertメソッドでviewHolderを通過する.addOnClickListenerバインドされたコントロールid
設定
adapterでのバインド方法addOnClickListenerをaddOnLongClickListenerに変更する.クリックイベントの設定方法setOnItemChildClickListenerをsetOnItemChildLongClickListenerに変更注意:サブコントロールを設定するイベントは、adapterにバインドされていないと、設定するコントロールが見つからないため、クリックイベントは有効になりません.クリックイベントで他のサブコントロールを取得する必要がある場合は、次の操作を行います.
注意:ヘッダーがある場合はpositionとheaderlayoutcountを処理する必要があります.
リストを追加してアニメーションをロード
アニメーション(既定はグラデーション)adapterをオンにします.openLoadAnimation(); 既定では5つの方法があります(グラデーション、スケール、下から上、左から右、右から左)
アニメーションの切り替え
カスタムアニメーション
アニメーションのデフォルトは1回のみ実行されます.繰り返し実行する場合は設定できます.
アニメーション数を表示しない設定
最初のインタフェースのitemは、アニメーションのロードを順次実行します.
インタフェースに入るitemは多くの速度で入ってくるのでスライド表示の順にアニメーションを実行することはありませんが、このとき一緒にアニメーションを実行します.このような効果が悪いと思ったらsetNotDoAnimationCountを使って第1画面itemを設定してアニメーションを実行しないようにしてもいいですが、順にアニメーションを実行する必要がある場合はstartAnimを書き直して最初の画面のitemアニメーションを遅延させて実行すればいいです.
頭部、末尾を追加
追加
指定ビューの削除
すべて削除
デフォルトでは、ヘッダーが表示されてもEmptyと末尾は表示されません.
デフォルトのヘッダーの末尾は1行で満たされています.必要に応じて満たされないように構成できます.
自動ロード
アップロード//最後のItemをスライドしたときのコールバックonLoadMoreRequestedメソッド
デフォルトの最初のロードはコールバックに入ります.必要でない場合は、次のように構成できます.
コールバック処理コード
ロード完了(ロード終了ではなく、今回のデータロードが終了し、次のページのデータもあることに注意)
ロード失敗
ロード終了
ロードをオンまたはオフにします(一般的には、ドロップダウンを同時に操作できないため、ドロップダウンするときに処理されます).
プリロード//リストが最後からN番目のItemにスライドしたとき(デフォルトは1)コールバックonLoadMoreRequestedメソッド
カスタムロードレイアウトの設定
レイアウトファイル
ドロップダウン・ロード(チャット・ソフトウェアのドロップダウン履歴データの要件に適合)設定オン・スイッチ
リスニングの設定
ロード開始位置
グループレイアウト
エンティティクラスはSectionEntityを継承する必要があります
adapter構造は2つのレイアウトidを入力する必要があります.1つ目はitemで、2つ目はheadで、convertメソッドにitemデータをロードし、convertHeadメソッドにheadデータをロードします.
マルチレイアウト
エンティティクラスはMultiItemEntityを実装する必要があります.データを設定する際には、各データにitemTypeを設定する必要があります.
構造の中でaddItemTypeはtypeとlayoutの関係をバインドします
GridLayoutManagerでitemを多重化する問題を考慮して、次のように構成できます.
空のレイアウトの設定
ドラッグ、スライド削除の追加
ドラッグ&スライド削除のコールバック方法
adapterはBaseItemDraggableAdapterを継承する必要があります
Activity使用コード
デフォルトでは、開発者が必要とする場合、複数の異なるViewタイプ間のドラッグはサポートされていません.
ItemDragAndSwipeCallbackのonMove()メソッドを書き換えると、return trueになります.
ツリーリスト
例:三級メニュー
adapterはBaseMultiItemQuickAdapterを継承する必要があります
すべてのメニューを開きます.
あるitemを削除します(追加と修正の考え方は同じです)
BRVAHは強力なRecyclerAdapterフレームワーク(RecyclerViewとは何ですか?)で、開発者の開発時間を大幅に節約し、ほとんどのリストの一般的なニーズソリューションを統合します.
文書ディレクトリ
フレーム導入
まず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)は、このコントロールを取得します.
一般的な方法
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();