RecyclerView的簡單使用

jopen 9年前發布 | 19K 次閱讀 Android開發 移動開發 RecyclerView

1、在布局文件中聲明

<android.support.v7.widget.RecyclerView
    android:id="@+id/my_recycler_view"
    android:scrollbars="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

2、在Activity中使用

// 1,找到這個View
mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
// 2,設置布局管理LayoutManager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
// 3,(可選)如果可以確定每個item的高度是固定的,設置這個選項可以提高性能
mRecyclerView.setHasFixedSize(true);
// 4,設置Adapter
mRecyclerView.setAdapter(new MyAdapter());

目前SDK中提供了三種自帶的LayoutManager:

  • LinearLayoutManager

    </li>

  • GridLayoutManager

    </li>

  • StaggeredGridLayoutManager

    </li> </ul>

    LinearLayoutManager

    mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

    GridLayoutManager

    mLayoutManager = new GridLayoutManager(context,columNum);
    mRecyclerView.setLayoutManager(mLayoutManager);

    :在Grid布局中也可以設置列表的Orientation屬性,來實現橫向和縱向的Grid布局。

    StaggeredGridLayoutManager

    瀑布流就使用StaggeredGridLayoutManager吧,具體使用方法見http://blog.csdn.net/duanymin/article/details/44979355

     

    3、Adapter的創建

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
        public String[] datas = null;
        public MyAdapter(String[] datas) {
            this.datas = datas;
        }
        //創建新View,被LayoutManager所調用
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);
            ViewHolder vh = new ViewHolder(view);
            return vh;
        }
        //將數據與界面進行綁定的操作
        @Override
        public void onBindViewHolder(ViewHolder viewHolder, int position) {
            viewHolder.mTextView.setText(datas[position]);
        }
        //獲取數據的數量
        @Override
        public int getItemCount() {
            return datas.length;
        }
        //自定義的ViewHolder,持有每個Item的的所有界面元素
        public static class ViewHolder extends RecyclerView.ViewHolder {
            public TextView mTextView;
            public ViewHolder(View view){
            super(view);
                mTextView = (TextView) view.findViewById(R.id.text);
            }
        }
    }

    4、添加單擊事件

    // 1 定義接口
    public static interface OnRecyclerViewItemClickListener {
        void onItemClick(View view , DataModel data);
    }

    // 2 添加接口和設置接口的方法 private OnRecyclerViewItemClickListener mOnItemClickListener = null; public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.mOnItemClickListener = listener; }

    // 3 在Adapter實現OnClickListener方法 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener{ @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, final int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false); ViewHolder vh = new ViewHolder(view); //將創建的View注冊點擊事件 view.setOnClickListener(this); return vh; } @Override public void onBindViewHolder(ViewHolder viewHolder, final int i) { viewHolder.mTextView.setText(datas.get(i).title); //將數據保存在itemView的Tag中,以便點擊時進行獲取 viewHolder.itemView.setTag(datas.get(i)); } ... @Override public void onClick(View v) { if (mOnItemClickListener != null) { //注意這里使用getTag方法獲取數據

        }
    ...
    

    }</pre>

    在Activity中

    mAdapter = new MyAdapter(getDummyDatas());
    mRecyclerView.setAdapter(mAdapter);
    mAdapter.setOnItemClickListener(new MyAdapter.OnRecyclerViewItemClickListener() {
        @Override
        public void onItemClick(View view, DataModel data) {
            //DO your fucking bussiness here!
        }
    });

    5、Item動畫

    // 設置item動畫 mRecyclerView.setItemAnimator(new DefaultItemAnimator());

    如果要自定義動畫效果需要繼承ItemAnimator

    GitHub上的動畫效果:RecyclerViewItemAnimators

     

    6、更新數據

    這里更新數據集不是用adapter.notifyDataSetChanged()而是 notifyItemInserted(position)與notifyItemRemoved(position) 否則沒有動畫效果。 

    為adapter中添加兩個方法:

    public void addData(int position) {
        mDatas.add(position, "Insert One");
        notifyItemInserted(position);
    }

    public void removeData(int position) { mDatas.remove(position); notifyItemRemoved(position); }</pre>
    來自:http://www.cnblogs.com/huangzx/p/4594980.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!