Recyclerview的使用

Android5.0後谷歌推出Recyclerview替代ListView,Gridview,接下來實現一個Recyclerview的簡單功能,先上效果圖:


實現了點擊事件,添加分割線,自定義分割線樣式,增加刪除item。

1.引入v7庫。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:24.1.1'
    compile 'com.android.support:recyclerview-v7:24.1.1'
}
2.初始化,爲recyclerview設置屬性,代碼裏有註釋

 private RecyclerView recyclerView;
    private List<String> mdata;
    private MyAdapter adapter;
    private LinearLayoutManager layoutManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();//初始化數據,供測試使用
        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);//設置佈局管理器,這裏設置的是線性佈局,還可以設置網格布
   局和流佈局   // recyclerView.setLayoutManager(new GridLayoutManager(this,4));網格佈局
               //recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));流佈局
        adapter = new MyAdapter(this, mdata);//自定義適配器
        recyclerView.setAdapter(adapter);//設置適配器
        recyclerView.addItemDecoration(new DividerItem(this));//增加分割線
        adapter.setOnItemCliclkListener(this);//設置點擊事件
    }
    private void initData() {
        mdata = new ArrayList<String>();
        for (int i = 0; i < 50; i++) {
            mdata.add("第" + i + "個數字");
        }
    }

3.點擊事件的實現

@Override
    public void onItemClick(View view, int position) {
        Toast.makeText(MainActivity.this, "第" + position + "個", Toast.LENGTH_SHORT).show();
    }

    public void addItem(View view) {
        int position=layoutManager.findFirstCompletelyVisibleItemPosition();
        adapter.addData(position);
    }

    public void deleteItem(View view) {
        int position=layoutManager.findFirstCompletelyVisibleItemPosition();
        adapter.removeData(position);
    }
這裏的position拿的是第一個,實際開發中根據自己的需要添加刪除。

4.Adapter的實現,這裏主要是實現加載子佈局,設置數據,定義接口,實現點擊事件

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private Context context;
    private List<String> mData;
    private MyItemOnClickListener onItemClickListener;
    public MyAdapter(Context context, List<String> data) {
        this.context = context;
        this.mData = data;
    }

    /*
    加載佈局,返回自定義的ViewHolder
     */
    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.recycleritem, viewGroup, false));
        return holder;
    }

    /**
     * 設置數據到view中
     */
    @Override
    public void onBindViewHolder(MyAdapter.MyViewHolder myViewHolder, final int i) {
        myViewHolder.textView.setText(mData.get(i));
       if(onItemClickListener!=null){ myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onItemClickListener.onItemClick(view, myViewHolder.getLayoutPosition());
            }
        });
}
    }

    @Override
    public int getItemCount() {//得到條目數
        return mData.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView textView;
        public MyViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.textview);

        }
    }

    /*
    點擊事件設置
     */
    public void setOnItemCliclkListener(MyItemOnClickListener itemCliclkListener) {
        this.onItemClickListener = itemCliclkListener;
    }

    public interface MyItemOnClickListener {
        public void onItemClick(View view, int position);
    }
    public void addData(int position){
        mData.add(position,"add item");
        notifyItemInserted(position);
    }
    public void removeData(int position){
        mData.remove(position);
        notifyItemRemoved(position);
    }
5.分割線的添加,在MainActivity中recyclerView.addItemDecoration(new DividerItem(this));增加了一條自己實現的分割線。具體的解釋代碼中有。
public class DividerItem extends RecyclerView.ItemDecoration{
    private static final int[] attrs={android.R.attr.listDivider};
    private Drawable mDrawable;
    public DividerItem(Context context){
        TypedArray array=context.obtainStyledAttributes(attrs);
        mDrawable=array.getDrawable(0);
        array.recycle();
    }
    /*
    繪製列表項的分割條
     */
    @Override
    public void onDrawOver(Canvas c, RecyclerView parent) {
        super.onDrawOver(c, parent);
        int left=parent.getPaddingLeft();//距離左邊的距離
        int right=parent.getWidth()-parent.getPaddingRight();//距離右邊的距離
        int chilidcount=parent.getChildCount();//獲取列表項的總數
        //繪製分割線
        for (int i=0;i<chilidcount;i++){
            View child=parent.getChildAt(i);//獲取當前的列表項
            RecyclerView.LayoutParams params=(RecyclerView.LayoutParams)child.getLayoutParams();
            //獲得參數佈局
            int top=child.getBottom()+params.bottomMargin;//獲得左上角的垂直距離
            int bottom=top+mDrawable.getIntrinsicHeight();//獲得右下角的垂直距離
            mDrawable.setBounds(left,top,right,bottom);//設置位置
            mDrawable.draw(c);//繪製分割線
        }
    }
6.自定義分割線樣式需要在style.xml中添加,具體實現如下:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="android:listDivider">@drawable/divideritems</item>
    </style>
然後新建divideriem文件,在裏面設置分割線的屬性。

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:centerColor="@color/material_grey_600"
        android:startColor="@color/material_grey_600"
        android:endColor="@color/material_grey_600"
        android:type="linear"></gradient>
    <size android:height="1dp"></size>
</shape>

源碼地址如下:點擊打開鏈接



發佈了88 篇原創文章 · 獲贊 18 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章