Android--RecyclerView的封裝使用

1,用了很長一段時間的RecyclerView,在項目中用的頻率也愈來愈頻繁(由於踩得坑也愈來愈多了),或過頭來看,感受一直在寫RecyclerView.Adapter中的三個方法和一個內部類,感受很浪費時間,那麼今天咱們來試着封裝封裝,來減小咱們的使用java

先看一下咱們的實現效果:android

2,咱們來簡單的寫一寫吧,首先咱們按照之前的方式寫的話,看看有哪些代碼,咱們先來發出來看看程序員

UserSimpleRecyclerAdapter.javaapp

package com.qianmo.myview2.base;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.qianmo.myview2.R;
import com.qianmo.myview2.bean.UserBean;

import org.w3c.dom.Text;

import java.util.List;

/**
 * Created by wangjitao on 2016/11/7 0007.
 */
public class UserSimpleRecycleAdapter extends RecyclerView.Adapter<UserSimpleRecycleAdapter.ViewHolder> {
    private Context context;
    private LayoutInflater inflater;
    private List<UserBean> datas;

    public UserSimpleRecycleAdapter(Context context, List<UserBean> datas) {
        this.context = context;
        this.inflater = LayoutInflater.from(context);
        this.datas = datas;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = inflater.inflate(R.layout.item_user, parent, false);
        ViewHolder holder = new ViewHolder(itemView);
        return holder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.tv_name.setText(datas.get(position).getName());
        holder.tv_age.setText(datas.get(position).getAge());
    }

    @Override
    public int getItemCount() {
        return datas == null ? 0 : datas.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView tv_name;
        TextView tv_age;

        public ViewHolder(View itemView) {
            super(itemView);

            tv_name = (TextView) itemView.findViewById(R.id.tv_name);
            tv_age = (TextView) itemView.findViewById(R.id.tv_age);
        }
    }
}

  能夠看到 getItemCount()、onCreateViewHolder()、onBindViewHolder()再加上ViewHolder內部類是咱們必需要寫的,可是寫長了咱們就能夠感受到  getItemCount()是基本上代碼相同的,通常在onCreateViewHolder中建立ViewHolder,在onBindViewHolder中寫數據和邏輯 ,而咱們程序員最管關心什麼呢  就是數據和邏輯的處理啊 ,若是咱們建立一個適配器只用寫咱們的邏輯的話,那咱們天天均可以省下好多時間來打一把lol了,如今帶你們一步一步封裝吧!dom

首先看一下咱們最關鍵的BaseViewHolderide

BaseViewHolder.javathis

package com.qianmo.myview2.base;

import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;

/**
 * Created by wangjitao on 2016/11/7 0007.
 * 萬能的Viewholder
 */
public class BaseViewHolder extends RecyclerView.ViewHolder {

    private SparseArray<View> views;

    public BaseViewHolder(View view) {
        super(view);
        this.views = new SparseArray<>();
    }

    public <T extends View> T getView(int viewId) {
        View view = views.get(viewId);
        if (view == null) {
            view = itemView.findViewById(viewId);
            views.put(viewId, view);
        }
        return (T) view;
    }

    public View getRootView() {
        return itemView;
    }
}

 其實裏面重要的就是views屬性和getView()方法 ,getView方法中用戶經過傳遞控件的id而後首先會去views這個集合中去拿,若是沒有的話說明是咱們的頭部,這樣就解決了屢次findView的問題,好像裏面也沒什麼難懂的,你們就看看吧。xml

  再看一下咱們的抽象類BaseRecycleViewAdapterblog

 BaseRecycleViewAdapter.java事件

package com.qianmo.myview2.base;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.balysv.materialripple.MaterialRippleLayout;
import com.qianmo.myview2.R;

import java.util.List;

/**
 * Created by wangjitao on 2016/11/7 0007.
 * 對簡單的recycleview進行簡單的封裝
 */
public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {
    private Context context;
    private LayoutInflater inflater;
    private List<T> datas;
    private int layoutId;
    protected OnItemClickListner onItemClickListner;//單擊事件
    protected OnItemLongClickListner onItemLongClickListner;//長按單擊事件
    private boolean clickFlag = true;//單擊事件和長單擊事件的屏蔽標識

    public BaseRecyclerViewAdapter(Context context, List<T> datas, int layoutId) {
        this.context = context;
        this.datas = datas;
        this.layoutId = layoutId;
        this.inflater = LayoutInflater.from(context);
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        BaseViewHolder holder = new BaseViewHolder(inflater.inflate(layoutId, parent, false));
        MaterialRippleLayout.on(holder.getView(R.id.ll_all))
                .rippleOverlay(true)
                .rippleAlpha(0.2f)
                .rippleColor(context.getResources().getColor(R.color.colorAccent))
                .rippleHover(true)
                .create();
        return holder;
    }

    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {
        bindData(holder, datas.get(position), position);
    }

    @Override
    public int getItemCount() {
        return datas == null ? 0 : datas.size();
    }

    protected abstract void bindData(BaseViewHolder holder, T data, int position);

    public void setOnItemClickListner(OnItemClickListner onItemClickListner) {
        this.onItemClickListner = onItemClickListner;
    }

    public void setOnItemLongClickListner(OnItemLongClickListner onItemLongClickListner) {
        this.onItemLongClickListner = onItemLongClickListner;
    }

    public interface OnItemClickListner {
        void onItemClickListner(View v, int position);
    }

    public interface OnItemLongClickListner {
        void onItemLongClickListner(View v, int position);
    }
}

 咱們在裏面處理了onCreateViewHolder和getItemCount這兩個咱們一直寫的方法,經過抽象方法把咱們最重要的onBindViewHolder方法暴露出去,這樣咱們就能夠在暴露出去的bindData()方法中去處理邏輯了,而且添加了建立的Item點擊事件和長按事件。

 咱們寫一個簡單的用戶展現列表看看效果如何,建立UserAdapter.java,看一下代碼:

 

package com.qianmo.myview2.base;

import android.content.Context;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.qianmo.myview2.R;
import com.qianmo.myview2.bean.UserBean;

import java.util.List;

/**
 * Created by Administrator on 2016/11/7 0007.
 */
public class UserAdapter extends BaseRecyclerViewAdapter<UserBean> {


    public UserAdapter(Context context, List<UserBean> datas, int layoutId) {
        super(context, datas, layoutId);
    }

    @Override
    protected void bindData(final BaseViewHolder holder, UserBean data, final int position) {
        LinearLayout ll_all = (LinearLayout) holder.getView(R.id.ll_all);
        TextView tv_name = (TextView) holder.getView(R.id.tv_name);
        TextView tv_age = (TextView) holder.getView(R.id.tv_age);

        tv_age.setText(data.getAge());
        tv_name.setText(data.getName());

        ll_all.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (onItemClickListner != null) {
                    onItemClickListner.onItemClickListner(holder.getRootView(), position);
                }
            }
        });
    }
}

  就問一句爽不爽 ,只須要寫一個方法了,還有誰!

再把完整的代碼貼出來一下

UserBean.java

package com.qianmo.myview2.bean;

/**
 * Created by Administrator on 2016/11/7 0007.
 */
public class UserBean {
    public UserBean(String name, String age) {
        this.name = name;
        this.age = age;
    }

    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

 item_user.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:background="#ffffff"
              android:orientation="vertical"
    >

    <LinearLayout
        android:id="@+id/ll_all"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:background="#ffffff"
        android:gravity="center_vertical"
        android:orientation="vertical"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            >

            <TextView
                android:id="@+id/tv_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="王繼濤"
                android:textColor="#000000"
                android:textSize="16sp"
                />

            <TextView
                android:id="@+id/tv_age"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="30dp"
                android:text="18381339409"
                android:textColor="#000000"
                android:textSize="16sp"
                />
        </LinearLayout>


    </LinearLayout>
</LinearLayout>

  MainActivity.java

package com.qianmo.myview2;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;

import com.qianmo.myview2.base.BaseRecyclerViewAdapter;
import com.qianmo.myview2.base.UserAdapter;
import com.qianmo.myview2.base.UserSimpleRecycleAdapter;
import com.qianmo.myview2.bean.UserBean;

import java.util.ArrayList;
import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity implements BaseRecyclerViewAdapter.OnItemClickListner {


    private RecyclerView recycleView;

    private Context mContext = MainActivity.this;
    private UserAdapter mAdapter;
    private UserSimpleRecycleAdapter mUserSimpleRecycleAdapter;
    private List<UserBean> datas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recycleView = (RecyclerView) findViewById(R.id.recycleView);

        initView();
    }

    private void initData() {
        datas = new ArrayList<>();
        for (int i = 0; i < 15; i++) {
            datas.add(new UserBean("wangjtiao", "" + i));
        }
    }

    private void initView() {
        initData();
        LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(mContext);
        mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recycleView.setLayoutManager(mLinearLayoutManager);

        mAdapter = new UserAdapter(mContext, datas, R.layout.item_user);
        mAdapter.setOnItemClickListner(this);

//        mUserSimpleRecycleAdapter = new UserSimpleRecycleAdapter(mContext, datas);
        recycleView.setAdapter(mAdapter);

    }

    @Override
    public void onItemClickListner(View v, int position) {
        Toast.makeText(mContext, datas.get(position).getName() + ":" + datas.get(position).getAge() + ":" + position, Toast.LENGTH_SHORT).show();
    }
}

  ok,這樣咱們就封裝完了·······

相關文章
相關標籤/搜索