RecyclerView 기본 사용 노트

13492 단어
주로 RecyclerView 기본 사용법, 삽입 삭제 Item, Item 클릭 이벤트 감청 포함
1. RecyclerView의 기본 사용
1. RecyclerView의 소개RecyclerView는support-V7보의 컨트롤로ListView,GridView 등을 대체하는 데 사용된다.다음은 공식적인 해석이다.
RecyclerView is a more advanced and flexible version of ListView. This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the RecyclerView widget when you have lists with elements that change dynamically. 사실 item을 동적으로 보여줄 필요가 있을 때 RecyclerView를 사용하는 것을 권장합니다.
2. RecyclerView 사용
  • 우선 이 가방의 인용을 가져와야 하고 app에 대응하는build가 필요합니다.gradle 파일에서 인용 가져오기:
  • dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.4.0'
        compile 'com.android.support:recyclerview-v7:23.4.0'//   RecyclerView    
    }
    

    내가 사용하는 안드로이드 스튜디오는 일반적으로 다음과 같은 절차로 인용을 추가합니다: File → Project Structure 왼쪽에서 대응하는 Moudle을 선택하고 오른쪽에서 Dependences →add → Library Dependece를 선택한 다음 대응하는 가방을 찾아서 추가하십시오.
  • 레이아웃 파일 activitynormal 중 사용:
  • 
    
    
        
            

    布局文件很简单,上面两个按钮,下面一个RecyclerView。

    3.然后在代码中对RecyclerView进行使用,一般需要做以下设置:

    public class NormalActivity extends AppCompatActivity implements View.OnClickListener {
        private RecyclerView mRecyclerView;
        private List mDatas;
        private HomeAdapter adapter;
        private Button insertBtn,removeBtn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_normal);
    
            insertBtn = (Button) findViewById(R.id.insertBtn);
            removeBtn = (Button) findViewById(R.id.removeBtn);
            insertBtn.setOnClickListener(this);
            removeBtn.setOnClickListener(this);
    
            mDatas = this.getIntent().getStringArrayListExtra("data");
    
            //  RecyclerView
            mRecyclerView = (RecyclerView) findViewById(R.id.id_normal_recyclerview);
    
            // RecyclerView       
            mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    
            // RecyclerView  Adapter
            adapter = new HomeAdapter(this, mDatas);
            mRecyclerView.setAdapter(adapter);
    
            // RecyclerView     (     DividerItemDecoration    ,   )
            mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.HORIZONTAL_LIST));
    
            //  
            mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.insertBtn:
                    adapter.addData(1);
                    break;
                case R.id.removeBtn:
                    adapter.removeData(1);
                    break;
            }
        }
    }
    

    RecyclerView를 사용하려면 일반적으로 레이아웃 관리자, 어댑터, 분할선, 애니메이션을 설정해야 합니다.
    주로 레이아웃 관리자에 대해 말하자면 모두 세 가지가 있는데 그것이 바로 LinearLayoutManager(선형 레이아웃), GridLayoutManager(격자 레이아웃), StaggeredGridLayoutManager(폭포류 레이아웃)이다.
    그런 다음 HomeAdapter의 내용을 살펴보십시오.
    public class HomeAdapter extends RecyclerView.Adapter{
        private List mDatas;
        private LayoutInflater mInflater;
        /**
         * Adapter        ,         ,  :LayoutInflater、data
         * @param mInflaters            Context,        LayoutInflater
         * @param mDatas             RecyclerView      
         */
        public HomeAdapter(Context context, List mDatas){
            this.mDatas = mDatas;
            mInflater = LayoutInflater.from(context);
        }
        /**
         *     ViewHolder   
         * @param parent
         * @param viewType              item ViewHolder
         * @return
         */
        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            /**
             * LayoutInflater.from(MainActivity.this)        inflater, fragment  
             */
            MyViewHolder holder = new MyViewHolder(mInflater.inflate(R.layout.item_normal, parent, false));
            return holder;
        }
    
        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            holder.tv.setText(mDatas.get(position));
        }
    
        /**
         *   item   
         */
        @Override
        public int getItemCount() {
            return mDatas.size();
        }
    
        public class MyViewHolder extends RecyclerView.ViewHolder {
            private TextView tv;
            public MyViewHolder(View view){
                super(view);
                //       view   MyViewHolder
                tv = (TextView) view.findViewById(R.id.id_num);
            }
        }
    
        public void addData(int position){
            mDatas.add(position, "insert");
            notifyItemInserted(position);
        }
    
        public void removeData(int position){
            mDatas.remove(position);
            notifyItemRemoved(position);
        }
    }
    

    이 어댑터는 Recycler View에서 상속되어야 합니다.Adapter 및 추상적인 접근 방식
    이러한 유형의 DividerItemDecoration은 분할선을 그리는 데 사용됩니다.
    public class DividerItemDecoration extends RecyclerView.ItemDecoration {
        private static final int[] ATTRS = new int[]{
                android.R.attr.listDivider
        };
    
        public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
        public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
        private Drawable mDivider;
        private int mOrientation;
    
        public DividerItemDecoration(Context context, int orientation) {
            final TypedArray a = context.obtainStyledAttributes(ATTRS);
            mDivider = a.getDrawable(0);
            a.recycle();
            setOrientation(orientation);
        }
    
        public void setOrientation(int orientation) {
            if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
                throw new IllegalArgumentException("invalid orientation");
            }
            mOrientation = orientation;
        }
    
        @Override
        public void onDraw(Canvas c, RecyclerView parent) {
    
            if (mOrientation == VERTICAL_LIST) {
                drawVertical(c, parent);
            } else {
                drawHorizontal(c, parent);
            }
    
        }
    
        public void drawVertical(Canvas c, RecyclerView parent) {
            final int left = parent.getPaddingLeft();
            final int right = parent.getWidth() - parent.getPaddingRight();
    
            final int childCount = parent.getChildCount();
            for (int i = 0; i < childCount; i++) {
                final View child = parent.getChildAt(i);
                android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
                final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                        .getLayoutParams();
                final int top = child.getBottom() + params.bottomMargin;
                final int bottom = top + mDivider.getIntrinsicHeight();
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            }
        }
    
        public void drawHorizontal(Canvas c, RecyclerView parent) {
            final int top = parent.getPaddingTop();
            final int bottom = parent.getHeight() - parent.getPaddingBottom();
    
            final int childCount = parent.getChildCount();
            for (int i = 0; i < childCount; i++) {
                final View child = parent.getChildAt(i);
                final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                        .getLayoutParams();
                final int left = child.getRight() + params.rightMargin;
                final int right = left + mDivider.getIntrinsicHeight();
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            }
        }
    
        @Override
        public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
            if (mOrientation == VERTICAL_LIST) {
                outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
            } else {
                outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
            }
        }
    }
    

    2. 삽입 삭제 Item
    위의 HomeAdapter에서는 다음과 같은 삽입 및 삭제 기능을 사용할 수 있습니다.
    public void addData(int position){
        mDatas.add(position, "insert");
        notifyItemInserted(position);
    }
    
    public void removeData(int position){
        mDatas.remove(position);
        notifyItemRemoved(position);
    }
    

    사실 주로 데이터에 대한 삽입 삭제 작업을 한 다음에 인터페이스를 업데이트한다.삽입은 notifyItemInserted()로 삭제하고 notifyItemRemoved()로 삭제합니다. 두 방법 모두 아래 첨자 인자가 필요합니다.
    3. Item 클릭 감청
    여기서 사실 나는 인터페이스 리셋으로 실현된 것으로 구체적으로 폭포류와 관련된 코드에 나타난다.
  • 인터페이스 초기화
  • 어댑터에서 인터페이스 속성 선언
  • onbindViewHolder() 방법에서 모든 Item에 클릭 이벤트를 추가하거나 길게 누르는 이벤트를 추가하고 인터페이스 변수에 대응하는 방법을 호출합니다(이때 클릭한 하위도 전송할 수 있습니다)
  • RecyclerView에 어댑터를 설정할 때 어댑터에 인터페이스 속성을 표시하는 것을 설정하면 Activity나 Fragment에서 Item 클릭 이벤트에 대한 감청을 실현할 수 있다
  • 4. 폭포류의 사용
    RecyclerView의 레이아웃 관리자를 다음과 같이 Staggered Grid LayoutManager로 설정해야 합니다.
    mRecycler.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL));
    //           ( ),          
    
    public class StaggeredAdapter extends RecyclerView.Adapter {
        private List mDatas;
        private LayoutInflater mInflaters;
    
        private List mHieghts;
        private List mWidths;
    
        /**
         * Adapter        ,         ,  :LayoutInflater、data
         * @param mInflaters            Context,        LayoutInflater
         * @param mDatas             RecyclerView      
         */
        public StaggeredAdapter(LayoutInflater mInflaters, List mDatas){
            this.mInflaters = mInflaters;
            this.mDatas = mDatas;
    
            //init heights and width
            mHieghts = new ArrayList<>();
            for (int i=0; i();
            for (int i=0; i position)
            {
                mDatas.remove(position);
            }else {
                return;
            }
    
            mHieghts.remove(position);
            mWidths.remove(position);
            notifyItemRemoved(position);
        }
        /**********************add and remove*************************/
    
        /**********************click listener*************************/
        public interface OnItemClickListener{
            void onItemClick(View view, int position);
            void onItemLongClick(View view, int position);
        }
    
        private OnItemClickListener mOnItemClickListener;
    
        public void setmOnItemClickListener(OnItemClickListener onItemClickListener){
            mOnItemClickListener = onItemClickListener;
        }
        /**********************click listener*************************/
    }
    

    위의 실현은 사실상 같은 ViewHolder를 사용한 다음에 이 ViewHolder의 레이아웃 파일의 높이를 바꾸어 폭포류와 비슷한 효과를 실현하는 것이다.onCreate View Holder(View Group parent, int view Type)라는 방법을 중점적으로 보십시오. 이 방법은 두 가지 파라미터가 있습니다.두 번째 매개변수는 뷰 유형이며 getItem ViewType(int position)의 반환값입니다.우리는 이 방법을 다시 쓸 수 있다. 서로 다른 데이터에 따라 서로 다른 값을 되돌려주고, 이 값은 매거 유형을 정의할 수 있다. 그리고 ViewHolder를 입을 때 유형에 따라 직접 만들 수 있다.
    그 다음에 ViewHolder에서 자주 사용하는 API는 getLayoutPosition()입니다. Item의 아래 첨자를 얻을 수 있습니다.
    전반적으로 말하면RecyclerView의 기본적인 용법은 이해했지만 표현이 좀 어지럽다.여기서 총결산을 하고 생각을 정리해 봅시다.그리고 mRecycler View 같아요.addItemDecoration(); mRecyclerView.setItemAnimator();이 두 방법의 용법은 아마도 실제 사용할 때 더욱 깊이 연구해야 할 것이다.그리고 클릭할 때 손가락을 길게 누르고 떠날 때도 클릭 이벤트를 촉발한다.

    좋은 웹페이지 즐겨찾기