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,這樣咱們就封裝完了·······