前文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'
首先看一下效果:
這裡跟前文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作為根布局,看一下它的類結構:
它繼承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使用還是有不錯的效果。