1,用了很長一段時間的RecyclerView,在項目中用的頻率也越來越頻繁(因為踩得坑也越來越多了),或過頭來看,感覺一直在寫RecyclerView.Adapter中的三個方法和一個內部類,感覺很浪費時間,那么今天我們來試着封裝封裝,來減少我們的使用
先看一下我們的實現效果:

2,我們來簡單的寫一寫吧,首先我們按照以前的方式寫的話,看看有哪些代碼,我們先來發出來看看
UserSimpleRecyclerAdapter.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 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了,現在帶大家一步一步封裝吧!
首先看一下我們最關鍵的BaseViewHolder
BaseViewHolder.java
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的問題,好像里面也沒什么難懂的,大家就看看吧。
再看一下我們的抽象類BaseRecycleViewAdapter
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,這樣我們就封裝完了·······
