天天看點

RecyclerView簡單使用介紹

RecyclerView詳解

廢話步多說,代碼中見理論,人生三階段,看别人代碼,改别人代碼,謝屬于自己的代碼

  1. 關聯庫

2.在布局檔案寫定義RecyclerView

<?xml version="1.0" encoding= "utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns: tools="http://schemas.android.com/tools"
    android :layout_width="match_parent"
    android :layout_height="match_parent"
    tools :context=".HelloRecyclerView">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width= "match_parent"
        android:layout_height= "match_parent"
      />
</RelativeLayout >
           

3.在代碼中執行個體化RecyclerView并且初始化資料

/**
* 資料集合
 */
private ArrayList<String> datas;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super .onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    recyclerview = (RecyclerView) findViewById(R.id.recyclerview); 
    initData();


}

/**
* 初始化資料
 */
private void initData() {
    datas = new ArrayList<>();
    for (int i = ; i < ; i++) {
        datas.add("我愛北京天安門" + i);
    }
}
           

4.設定擴充卡(難)

定義擴充卡

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;
    }
    /**
     * 相當于 ListView擴充卡中的getView的建立holder 布局
     *
     * @param parent
     * @param viewType
     * @return
     */
    @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);

        }
    }
}
           

5.設定布局檔案

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#33000000"
    android:padding="2dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:gravity="center"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/iv_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="3dp"
            android:src="@drawable/video_default" />

        <TextView
            android:id="@+id/tv_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:padding="3dp"
            android:text="内容"
            android:textColor="#000000"
            android:textSize="15sp" />

    </LinearLayout>

</RelativeLayout>
           

6.設定擴充卡-水準方向- 豎直方向 -網格-瀑布流

myAdapter = new MyAdapter(this, datas);
recyclerview.setAdapter( myAdapter);


/**
*  設定布局:
 * 第一個參數:上下文
 * 第二參數:方向
 * 第三個參數:排序低到高還是高到低顯示, false是低到高顯示
 *
*/
LinearLayoutManager linearLayoutManager =  new LinearLayoutManager(this, LinearLayoutManager.VERTICAL , false);

GridLayoutManager gridLayoutManager =  new GridLayoutManager(this, ,GridLayoutManager.VERTICAL, false);

StaggeredGridLayoutManager staggeredGridLayoutManager =  new StaggeredGridLayoutManager(,StaggeredGridLayoutManager. HORIZONTAL);

recyclerview.setLayoutManager(linearLayoutManager);
           

7.設定分割線

代碼是借鑒網上的
//設定分割線-分割線需要自定義&還可以自定義分割線的樣式
//沒有提供預設的分割線
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();
        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) {
//        Log.e("recyclerview - itemdecoration", "onDraw()");

        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 = ; 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 = ; 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(, , , mDivider.getIntrinsicHeight());
        } else {
            outRect.set(, , mDivider.getIntrinsicWidth(), );
        }
    }
}
           

9,自定義設定item的點選事件或者item中某個控件的點選事件

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;
    /**
     * 設定某條的監聽
     * @param onItemClickListener
     */
    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    //設定點選圖檔

    //設定點選某個item的監聽
    public interface OnImageViewClickListener{

        void onImageViewClick(View view,int position);
    }

    private OnImageViewClickListener onImageViewClickListener;
    /**
     * 設定監聽圖檔
     * @param 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());
                    }
                }
            });


        }
    }

}
           
  1. 在Activity中使用自定義的點選事件
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();
    }
});
           

11.删除和增加資料

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

     ........................

    /**
     * 添加資料
     * @param position
     * @param content
     */
    public void addData(int position,String content){
        datas.add(position,content);
        notifyItemInserted(position);

    }

    /**
     * 移除資料
     * @param position
     */
    public void removeData(int position){
        datas.remove(position);
        notifyItemRemoved(position);
     }


}
           

12設定删除某條和增加某條的動畫

recyclerview.setItemAnimator(new DefaultItemAnimator());