1. 程式人生 > >為RecyclerView打造萬能介面卡,點選事件,5.0水波紋點選效果

為RecyclerView打造萬能介面卡,點選事件,5.0水波紋點選效果

一.前言

最近使用到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檔案


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的效果
5.0的水波紋效果