Android Lに登場した新しいコントロールRecyclerViewが最近プロジェクトで使用され、学習プロセスが今後の問い合わせのために投稿されました。
RecyclerViewは、次の4つの構成を提供します。
- RecyclerView.LayoutManager
- RecyclerView.Adapter <VHはRecyclerView.ViewHolderを拡張します>
- RecyclerView.ItemDecoration
- RecyclerView.ItemAnimator
RecyclerView.LayoutManager
3つのレイアウトがあります。
- GridLayoutManagerグリッドレイアウト
- LinearLayoutManager線形レイアウト
- StaggeredGridLayoutManagerウォーターフォールフローレイアウト
RecyclerView.ItemDecoration
特別なRecyclerViewビューを描画し、参照記事を配置することができますhttp://blog.csdn.net/lmj623565791/article/details/45059587
RecyclerView.ItemAnimator
アニメーション効果。アイテムを追加および削除するときのRecyclerViewのアニメーション効果を指定できます。同様に、参照効果を配置し
ますhttps://github.com/wasabeef/recyclerview-animators
RecyclerView.Adapter <VHはRecyclerView.ViewHolderを拡張します>
リストビューのアダプターと比較すると、RecyclerViewのアダプターはViewHolderを分離するように強制されます。書き直す必要のあるメソッドがいくつかあります。
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
private Context context;
private List<String> list;
public RankRecyclerViewAdpter(Context context, List<String> list) {
this.context = context;
this.list = list;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.textView.setText(list.get(position));
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
public ViewHolder(View View) {
super(view);
textView= (TextView) itemView.findViewById(R.id.textView);
}
}
}
注意すべきいくつかの問題があります。
- レイアウトに配置する必要があります。
android.support.v7.widget.RecyclerView
そうしないと、エラーが報告されます。getItemCount()
戻り値を空にすることはできません。空にしないと実行されません。onBindViewHolder
- RecyclerViewはLayoutMangerを指定する必要があります。指定しない場合、エラーも報告されます。
RecyclerViewのクリックイベント
公式ドキュメントでは、ListViewのようなOnItemClickListener
コールバックメソッドは提供されていません。RecyclerViewはListViewよりも高度であるため、行または列の概念はありません。子ビューは任意にレイアウトできます。各子ビューは独自のonClickイベントを処理します。 、これは、アダプタセットで子ビューのルートビューのクリックコールバックを設定することを意味します。今日達成したいのは、ListViewと同様の別の方法OnItemClickListener
です。ドキュメントを通じて、RecyclerViewが開発者向けのRecyclerView.OnItemTouchListener
インターフェイスを残していることがわかります。必要なのは、それを実装し、クリックコールバックと長押しコールバックを実装することだけです。もちろん、このメソッドはほんの始まりに過ぎず、さまざまな複雑なジェスチャ操作のコールバックに拡張することもできます。
参照元:http://blog.csdn.net/hlglinglong/article/details/44981889
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener{
private View childView;
private RecyclerView touchView;
public RecyclerItemClickListener(Context context, final OnItemClickListener mListener) {
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener(){
@Override
public boolean onSingleTapUp(MotionEvent ev) {
if (childView != null && mListener != null) {
mListener.onItemClick(childView, touchView.getChildPosition(childView));
}
return true;
}
@Override
public void onLongPress(MotionEvent ev) {
if (childView != null && mListener != null) {
mListener.onLongClick(childView, touchView.getChildPosition(childView));
}
}
});
}
GestureDetector mGestureDetector;
public interface OnItemClickListener {
public void onItemClick(View view, int position);
public void onLongClick(View view, int posotion);
}
@Override
public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
mGestureDetector.onTouchEvent(motionEvent);
childView = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY());
touchView = recyclerView;
return false;
}
@Override
public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
}
}
リストビューと同様にaddHeaderView
してaddFooterView
RecyclerViewもlistviewaddHeaderView
と同様のaddFooterView
メソッドを提供していませんが、カスタマイズでき
ます。 記事を参照してください:https://github.com/dingdingyr/HeaderAndFooterRecyclerView-
原則は次のとおりです。
GridLayoutManager manager = new GridLayoutManager(this, 2);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return adapter.getItemViewType()? manager.getSpanCount() : 1;
}
});
GirdLayoutは表示される行数を設定でき、表示するアイテムのタイプに応じてこの値を指定できます。
もう1つの問題は、ビュー全体が強制的に更新され、新しいデータが挿入された場合に使用できるnotifyDataSetChanged()
ため、apdaterを更新するときに推奨notifyDataSetChanged()
されないことpublic final void notifyItemRangeInserted(int positionStart, int itemCount);
です。