花式RecyclerView設置,含代碼

1. 添加依賴和使用

  1. 添加依賴;寫佈局文件;實例化RecyclerView並且初始化數據;

2. 設置適配器<並定義 item>

  1. 設置適配器<並定義 item>

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
        private final Context context;
        private final ArrayList<String> datas;
        public MyAdapter(Context context, ArrayList<String> datas) {
            this.context = context;
            this.datas = datas;
        }
        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = View.inflate(context, R.layout.item_hello, null);
            return new MyViewHolder(view);
        }
        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            holder.tv_text.setText(datas.get(position));
            holder.iv_icon.setBackgroundResource(R.mipmap.ic_launcher);
        }
        @Override
        public int getItemCount() {
            return datas.size();
        }
        class MyViewHolder extends RecyclerView.ViewHolder {
            private TextView tv_text;
            private ImageView iv_icon;
            public MyViewHolder(View itemView) {
                super(itemView);
                tv_text = (TextView) itemView.findViewById(R.id.tv_text);
                iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);
            }
        }
    }
    

3. 設置適配器:水平方向-豎直方向-網格-瀑布流

  1. 設置適配器(重難點):水平方向-豎直方向-網格-瀑布流;
  2. 效果圖如下:上層是水平方向;下面是瀑布流;豎直方向跟 ListView 一樣;
    在這裏插入圖片描述
    myAdapter = new MyAdapter(this,datas);
    recyclerview.setAdapter(myAdapter);
    /**
     *  設置佈局:
     * 第一個參數:上下文
     * 第二參數:方向
     * 第三個參數:排序低到高還是高到低顯示,false是低到高顯示
     */
    LinearLayoutManager linearLayoutManager =  new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
    GridLayoutManager gridLayoutManager =  new GridLayoutManager(this, 3,GridLayoutManager.VERTICAL, false);
    StaggeredGridLayoutManager staggeredGridLayoutManager =  new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.HORIZONTAL);
    recyclerview.setLayoutManager(linearLayoutManager);
    

4. 添加分割線

  1. 添加分割線
    參照網址:http://blog.csdn.net/lmj623565791/article/details/45059587

    	//設置分割線-分割線需要自定義&還可以自定義分割線的樣式
    	//沒有提供默認的分割線
    	recyclerview.addItemDecoration(new DividerListItemDecoration(this, DividerListItemDecoration.VERTICAL_LIST));
    	 	 
    	public class DividerListItemDecoration 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 DividerListItemDecoration(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);
    	        }
    	    }
    	}
    

5. 設置分割線樣式

  1. 設置分割線樣式
    在 tlsxl 樣式文件中

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:listDivider">@drawable/divider_bg</item>
    </style>
    
    <!-- Application theme. -->
    <style name="listDividerTheme" >
        <item name="android:listDivider">@drawable/divider_bg</item>
    </style>
     
    在drawable目錄下的divider_bg.xml
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle" >
        <gradient
            android:centerColor="#ff00ff00"
            android:endColor="#ff0000ff"
            android:startColor="#ffff0000"
            android:type="linear" />
        <size android:height="2dp"/>
    </shape>
    

6. 設置item的點擊事件

  1. 自定義設置item的點擊事件或者item中某個控件的點擊事件;
    RecyclerView默認是沒有點擊事件的,需要自定義點擊事件

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    
        private final Context context;
        private final ArrayList<String> datas;
    	
        //設置點擊某個item的監聽
        public interface OnItemClickListener{
             void onItemClick(View view,int position,String content);
        }
    
        private OnItemClickListener onItemClickListener;
        public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
            this.onItemClickListener = onItemClickListener;
        }
        //設置點擊某個item的監聽
        public interface OnImageViewClickListener{
            void onImageViewClick(View view,int position);
        }
    
        private OnImageViewClickListener onImageViewClickListener;
        /**
         * 設置監聽圖片
         */
        public void setOnImageViewClickListener(OnImageViewClickListener onImageViewClickListener) {
            this.onImageViewClickListener = onImageViewClickListener;
        }
    
        class MyViewHolder extends RecyclerView.ViewHolder {
    
            private TextView tv_text;
            private ImageView iv_icon;
    
            public MyViewHolder(View itemView) {
                super(itemView);
                tv_text = (TextView) itemView.findViewById(R.id.tv_text);
                iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);
    
                //設置點擊事件
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(onItemClickListener != null){
                            onItemClickListener.onItemClick(v,getLayoutPosition(),datas.get(getLayoutPosition()));
                        }
                    }
                });
    
                //設置監聽
                iv_icon.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(onImageViewClickListener != null){
                            onImageViewClickListener.onImageViewClick(v,getLayoutPosition());
                        }
                    }
                });	
            }
        }
    }
     
    //在Activity中使用自定義的點擊事件
    //設置點擊item的點擊事件
    myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position, String content) {
            Toast.makeText(RecyclerViewActivity.this, "content=="+content+",--position=="+position, Toast.LENGTH_SHORT).show();
        }
    });
    
    //設置點擊某張圖片的點擊事件
    myAdapter.setOnImageViewClickListener(new MyAdapter.OnImageViewClickListener() {
        @Override
        public void onImageViewClick(View view, int position) {
            Toast.makeText(RecyclerViewActivity.this, "position=="+position+",view=="+view.toString(), Toast.LENGTH_SHORT).show();
        }
    });
    

7. 刪除和增加數據

  1. 刪除和增加數據
    1. 在適配器中新增加添加和刪除兩個方法

      public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
          /**
           * 添加數據
           */
          public void addData(int position,String content){
              datas.add(position,content);
              notifyItemInserted(position);
          }
          /**
           * 移除數據
           */
          public void removeData(int position){
              datas.remove(position);
              notifyItemRemoved(position);
          }
      }
      
    2. 在佈局文件中添加點擊按鈕:添加、移除、List、Grid

    3. 點擊事件

      private void setLitener() {
          btn_add.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  myAdapter.addData(0,"Content NetData");
                  //定位到第0個位置
                  recyclerview.scrollToPosition(0);
              }
          });
      
          btn_remove.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  myAdapter.removeData(0);
              }
          });
      
          btn_grid.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  GridLayoutManager gridLayoutManager =  new GridLayoutManager(RecyclerViewActivity.this, 2,GridLayoutManager.VERTICAL, false);
                  recyclerview.setLayoutManager(gridLayoutManager);
              }
          });
      
          btn_list.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  LinearLayoutManager linearLayoutManager =  new LinearLayoutManager(RecyclerViewActivity.this, LinearLayoutManager.VERTICAL, false);
                  recyclerview.setLayoutManager(linearLayoutManager);
              }
          });
      }
      

8. 設置刪除和增加的動畫

  1. 設置刪除某條和增加某條的動畫

    //設置動畫
    recyclerview.setItemAnimator(new DefaultItemAnimator());
    
  2. 聲明:本博客根據尚硅谷來自 ‘阿福’ 老師 項目實戰: 北京新聞.學習整理;

  3. 新聞類APP系列學習筆記見:新聞APP;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章