為RecyclerView打造萬能介面卡,點選事件,5.0水波紋點選效果
阿新 • • 發佈:2019-01-01
一.前言
最近使用到RecyclerView,RecyclerView使用詳解戳這裡,由於使用過張鴻洋大神的ListView萬能Adapter,感覺RecyclerView的Adapter編寫還是太麻煩了,而且沒有點選事件,ok,參考ListView的萬能Adapter的思路,寫一個RecyclerView通用的Adapter,在加上點選效果( ̄︶ ̄)↗ 漲
二.程式碼編寫
- RecyclerAdapter的編寫
package com.example.admin.recyclerviewdemo;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
/**
* Created by 橘子桑 on 2016/1/2.
*/
public abstract class RecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerViewHolder> {
private Context mContext;
private List<T> mDatas;
private int mLayoutId;
private LayoutInflater mInflater;
private OnItemClickListener onItemClickListener;
public RecyclerAdapter(Context mContext, List<T> mDatas, int mLayoutId) {
this.mContext = mContext;
this.mDatas = mDatas;
this.mLayoutId = mLayoutId;
mInflater = LayoutInflater.from(mContext);
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//這裡是建立ViewHolder的地方,RecyclerAdapter內部已經實現了ViewHolder的重用
//這裡我們直接new就好了
return new RecyclerViewHolder(mInflater.inflate(mLayoutId, parent, false));
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
}
public abstract void convert(RecyclerViewHolder holder, T data, int position);
@Override
public int getItemCount() {
return mDatas.size();
}
/**自定義RecyclerView item的點選事件的點選事件*/
interface OnItemClickListener {
void OnItemClickListener(View view, int position);
}
}
上面參考ListView的萬能介面卡,寫的一個抽象類,可以看到onBindViewHolder方法裡面是空的,我們需要在這裡來,加入點選事件和效果。
- RecyclerHolder
package com.example.admin.recyclerviewdemo;
import android.graphics.Bitmap;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
/**
* Created by 橘子桑 on 2016/1/2.
*/
public class RecycleHolder extends RecyclerView.ViewHolder {
/** 用於儲存當前item當中的View */
private SparseArray<View> mViews;
public RecycleHolder(View itemView) {
super(itemView);
mViews = new SparseArray<View>();
}
public <T extends View> T findView(int ViewId) {
View view = mViews.get(ViewId);
//集合中沒有,則從item當中獲取,並存入集合當中
if (view == null) {
view = itemView.findViewById(ViewId);
mViews.put(ViewId, view);
}
return (T) view;
}
public RecycleHolder setText(int viewId, String text) {
TextView tv = findView(viewId);
tv.setText(text);
return this;
}
public RecycleHolder setText(int viewId, int text) {
TextView tv = findView(viewId);
tv.setText(text);
return this;
}
public RecycleHolder setImageResource(int viewId, int ImageId) {
ImageView image = findView(viewId);
image.setImageResource(ImageId);
return this;
}
public RecycleHolder setImageBitmap(int viewId, Bitmap bitmap) {
ImageView image = findView(viewId);
image.setImageBitmap(bitmap);
return this;
}
public RecycleHolder setImageNet(int viewId, String url) {
ImageView image = findView(viewId);
//使用你所用的網路框架等
return this;
}
}
可以看的上面程式碼非常的簡單,就是儲存了當前item中的View而已,因為RecyclerView內部已經實現了ViewHolder的重用<( ̄︶ ̄)>
- 為RecyclerView新增item的點選事件
@Override
public void onBindViewHolder(final RecycleHolder holder, int position) {
if (onItemClickListener != null) {
//設定背景
holder.itemView.setBackgroundResource(R.drawable.recycler_bg);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//注意,這裡的position不要用上面引數中的position,會出現位置錯亂
onItemClickListener.OnItemClickListener(holder.itemView, holder.getLayoutPosition());
}
});
}
convert(holder, mDatas.get(position), position);
}
public abstract void convert(RecycleHolder holder, T data, int position);
上面就完成了,萬能介面卡的編寫,還有點選事件的添加了
- drawable xml 程式碼
為了讓5.0以上的系統產生水波紋效果,所以我們新建一個drawable-v21目錄來存放drawable檔案
5.0以下drawable檔案
recycler_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<shape android:shape="rectangle">
<solid android:color="#cfd8dc"></solid>
</shape>
</item>
</selector>
5.0以上 drawable-v21
recycler_rectangle.xml
recycler_bg.xml
<!--點擊出現的水波紋效果是矩形的 -->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="#FFFFFF" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<!-- ripple 是5.0才出現的新標籤-->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#cfd8dc" ><!-- 點擊出現的水波紋的顏色 -->
<item android:drawable="@drawable/recycler_rectangle"/>
</ripple>
三.使用
寫個匿名類就OK了╭(′▽`)╯ 是不是比以前簡單好多
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView rv_list = findView(R.id.rv_list);
rv_list.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
rv_list.setAdapter(TextAdapter = new RecyclerAdapter<String>(this, getData(), R.layout.recycler_item) {
@Override
public void convert(RecycleHolder holder, String data, int position) {
holder.setText(R.id.tv, data);
holder.setImageResource(R.id.image, R.mipmap.ic_launcher);
}
});
TextAdapter.setOnItemClickListener(new RecyclerAdapter.OnItemClickListener() {
@Override
public void OnItemClickListener(View view, int position) {
ToastShow("點選" + position);
}
});
}
四.效果
5.0的效果