RecyclerView自定义基础通用Adapter和ViewHolder
仅建立一个adapter,配合自定义布局holder,轻松搞定各种RecyclerView布局使用。
1、首先建立BaseViewHolder基础类
public abstract class BaseViewHolder<T> extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener{
public MyAdapterListener myAdapterListener;
protected Context context;
public BaseViewHolder(Context context, ViewGroup root, int layoutRes, MyAdapterListener listener) {
super(LayoutInflater.from(context).inflate(layoutRes, root, false));//super(View view)
this.context=context;
this.myAdapterListener =listener;
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
public Context getContext() {
return itemView.getContext();
}
/**绑定数据入口*/
public abstract void bindData(T t);
@Override
public void onClick(View v) {
if(myAdapterListener !=null){
myAdapterListener.onItemClick(getAdapterPosition());
}
}
@Override
public boolean onLongClick(View v) {
if(myAdapterListener !=null){
myAdapterListener.onItemLongClick(getAdapterPosition());
}
return true;
}
}
其中MyAdapterListener监听点击事件类代码如下:
public interface MyAdapterListener {
void onItemClick(int position);
void onItemLongClick(int position);
}
2、再建立Adapter基础类
public abstract class BaseViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List msgs = new ArrayList<>();
public void add2MsgList(List msgs){
if (msgs == null) return;
this.msgs = msgs;
}
public BaseViewAdapter(){
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return getHolder();
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
((BaseViewHolder)holder).bindData(msgs.get(position));
}
@Override
public int getItemCount() {
return msgs.size();
}
public abstract BaseViewHolder getHolder();
}
至此准备工作已经全部做好,剩下的就只有我们的自定义Layout了。
3、建立一个自定义ViewHolder类,继承自BaseViewHolder:
public class MyViewHolder extends BaseViewHolder {
public MyViewHolder(Context context, MyAdapterListener listener) {
super(context, null, R.layout.item_list_simple, listener);//一个类对应一个布局文件
}
@Override
public void bindData(Object o) {
if (o==null) return;
((TextView)itemView).setText((String)o);
}
}
其中 R.layout.item_list_simple 代码如下:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:clickable="true"
android:id="@+id/textView"
android:padding="10dp"
android:text="1232433"
android:background="@drawable/ripple_bg"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</TextView>
4、最后在activity里初始化和加载数据并添加监听器:
public class TestActivity extends Activity {
RecyclerView recyclerView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fra_message_talk);
LinearLayoutManager manager = new LinearLayoutManager(this);
BaseViewAdapter adapter = new BaseViewAdapter() {
@Override
public BaseViewHolder getHolder() {
return new MyViewHolder(getBaseContext(),listener);
}
};
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(manager);
recyclerView.setAdapter(adapter);
//添加数据
List msgs = new ArrayList();
for (int i = 0; i < 20; i++) {
Log.d("logd","i = "+i);
msgs.add(String.valueOf(i));
}
adapter.add2MsgList(msgs);
adapter.notifyDataSetChanged();
}
MyAdapterListener listener = new MyAdapterListener() {
@Override
public void onItemClick(int position) {
Log.d("logd","点击 位置="+position);
}
@Override
public void onItemLongClick(int position) {
Log.d("logd","长按点击 位置="+position);
}
};
}
其中 R.layout.fra_message_talk 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>