RecyclerViewの使用法を学ぶ

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);です。

おすすめ

転載: blog.csdn.net/Ser_Bad/article/details/51166636