天天看點

Android CardView使用

前文Android RecyclerView 使用已經對RecyclerView的基本使用做了介紹,這裡就接着講一下和RecyclerView同時在5.0推出的另外一個新控件CardView。

結合RecyclerView寫一個demo來介紹CardView,順便将RecyclerView怎麼添加item的點選事件以及删除某個item作簡單介紹。

使用前同樣記得添加依賴:

compile 'com.android.support:recyclerview-v7:24.2.1'
    compile 'com.android.support:cardview-v7:24.2.1'
           

首先看一下效果:

Android CardView使用

這裡跟前文demo不同的就是item的布局改變了,使用CardView,看一下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_marginTop="5dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardCornerRadius="4dp"
    card_view:cardBackgroundColor="@color/cardViewcolor"

    card_view:cardElevation="3dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:paddingLeft="10dp"
            android:textSize="25sp"
            android:text="姓名"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/name" />

        <TextView
            android:paddingLeft="10dp"
            android:textSize="25sp"
            android:text="号碼"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/number" />
    </LinearLayout>
</android.support.v7.widget.CardView>
           

以CardView作為根布局,看一下它的類結構:

Android CardView使用

它繼承FrameLayout,看它的介紹:

A FrameLayout with a rounded corner background and shadow.

它可擁有陰影和圓角,看上面的效果圖就明顯了,它的陰影和圓角主要是通過下面屬性來設定的:

card_view:cardCornerRadius="4dp" 圓角
    card_view:cardBackgroundColor="@color/cardViewcolor"背景顔色
    card_view:cardElevation="3dp"陰影
           

看到上面的效果圖,點選和長壓item都有壓下的效果,但是這裡它的背景隻能設定顔色,那是怎麼讓它可以在不同狀态有不同顔色呢?後面看。

首先來看一下給RecyclerView的item添加監聽事件:

定義一個接口,兩個函數點選和長壓時的回調

public interface RecyclerViewItemListener {
    public void onClick(View view,int position);
    public void onLongClick(View view,int position);
}
           

然後在RecyclerView.Adapter裡添加該接口,同時對item添加監聽事件:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
        private ArrayList<Contact> mDataset;
        private RecyclerViewItemListener mRecyclerViewItemListener;......
           
public void setRecyclerViewItemListener(RecyclerViewItemListener recyclerViewItemListener){
            this.mRecyclerViewItemListener = recyclerViewItemListener;
        }
           

設定item的監聽

// Replace the contents of a view (invoked by the layout manager)
        @Override
        public void onBindViewHolder(final ViewHolder holder, final int position) {
            // - get element from your dataset at this position
            // - replace the contents of the view with that element
            Log.d("test","onBindViewHolder  holder="+holder+ " position="+position);
            holder.View.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if(event.getAction() == MotionEvent.ACTION_DOWN){
                        ((CardView)(holder.View)).setCardBackgroundColor(getResources().getColor(R.color.cardViewDarkcolor));
                    }else {
                        ((CardView)(holder.View)).setCardBackgroundColor(getResources().getColor(R.color.cardViewcolor));
                    }
                    return false;
                }
            });
            holder.View.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //.....
                    if(mRecyclerViewItemListener !=null){
                        mRecyclerViewItemListener.onClick(v,position);//這個position是在集合中位置
                    }
                }
            });
            holder.View.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    if(mRecyclerViewItemListener !=null){
                        mRecyclerViewItemListener.onLongClick(v,holder.getLayoutPosition());//這個擷取position是在目前螢幕顯示的位置
                        return true;
                    }
                    return false;
                }
            });

            holder.name.setText(mDataset.get(position).getName());
            holder.number.setText(mDataset.get(position).getNumber());

        }
           

點選每個item時會回調mRecyclerViewItemListener.onClick(v,position)  這裡參數position我直接給該item在資料集合中的位置

長按每個item時會回調mRecyclerViewItemListener.onLongClick(v,holder.getLayoutPosition()) 這裡position通過ViewHolder擷取的位置是該item目前在螢幕上的位置 。

自己實際需求傳什麼參數,這裡隻是為了比較一下。

這裡還給每個item設定了OnTouchListener :holder.View.setOnTouchListener(new View.OnTouchListener() ),因為前面發現CardView的背景顔色隻能設定顔色,意味着點選時或長按時都沒法看到壓下的效果,體驗不好,是以這裡添加這個監聽對CardView的背景顔色進行相應變換。

給adapter設定mRecyclerViewItemListener

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(this);
        mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mAdapter = new MyAdapter(datas);
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.setRecyclerViewItemListener(this);
           

看看回調怎麼做的:

@Override
public void onClick(View view, int position) {
    Toast.makeText(this,"撥打 "+position+"--"+datas.get(position).getName()+"的電話号碼",Toast.LENGTH_SHORT).show();
}

@Override
public void onLongClick(View view, int position) {
    Toast.makeText(this,"長按 position="+position,Toast.LENGTH_SHORT).show();
    mAdapter.notifyItemRemoved(position);
}      

前文講過RecyclerView删除裡一個item調用notifyItemRemoved。

其實CardView的使用比較簡單,結合RecyclerView使用還是有不錯的效果。

繼續閱讀