前言:上篇文章寫了打造适配ListView的萬能Adapter,有需要的請轉:https://blog.csdn.net/fsx_xiaomei/article/details/88824907
,今天來打造适配RecyclerView的萬能BaseAdapter。
一、一般寫法
- RecyclerActivity(需要注意的是,RecyclerView一定要setLayoutManager,否則運作程式不會出錯,但是真個RecyclerView不展示)
public class RecyclerActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private List<Bean> mList;
private LinearLayoutManager manager;
private PersonRecyclerAdapter mAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler);
mRecyclerView = findViewById(R.id.recycler);
initData();
initView();
}
private void initData() {
mList = new ArrayList<>();
mList.add(new Bean("xiaoming 1", "湖南省長沙市天心區", 18));
mList.add(new Bean("xiaoming 2", "湖南省長沙市天心區", 18));
mList.add(new Bean("xiaoming 3", "湖南省長沙市天心區", 18));
mList.add(new Bean("xiaoming 4", "湖南省長沙市天心區", 18));
mList.add(new Bean("xiaoming 5", "湖南省長沙市天心區", 18));
mList.add(new Bean("xiaoming 6", "湖南省長沙市天心區", 18));
}
private void initView() {
if (manager == null)
manager = new LinearLayoutManager(this);
if (mAdapter == null)
mAdapter = new PersonRecyclerAdapter(this);
mAdapter.setData(mList);
mRecyclerView.setLayoutManager(manager);
mRecyclerView.setAdapter(mAdapter);
}
}
- PersonRecyclerAdapter
public class PersonRecyclerAdapter extends RecyclerView.Adapter<PersonRecyclerAdapter.ViewHolder> {
private List<Bean> mData;
private Context mContext;
public void setData(List<Bean> mData) {
this.mData = mData;
this.notifyDataSetChanged();
}
public PersonRecyclerAdapter(Context mContext) {
this.mContext = mContext;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
ViewHolder viewHolder = new ViewHolder(convertView);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
Bean bean = mData.get(position);
if (bean != null) {
viewHolder.tv_name.setText(bean.getName());
viewHolder.tv_address.setText(bean.getAddress());
viewHolder.tv_age.setText("年齡:" + bean.getAge());
}
}
@Override
public int getItemCount() {
return (mData == null) ? 0 : mData.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView tv_name;
public TextView tv_address;
public TextView tv_age;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tv_name = itemView.findViewById(R.id.tv_name);
tv_address = itemView.findViewById(R.id.tv_address);
tv_age = itemView.findViewById(R.id.tv_age);
}
}
}
- 實體類Bean(基礎和萬能Adapter都一樣,這裡就是使用的ListView使用過的bean)
public class Bean {
private String name;
private String address;
private int age;
...//省略set,get和construct方法
}
- xml布局(省略),運作效果和ListView顯示效果一樣
- 運作效果
打造适配RecyclerView的萬能BaseAdapter
二、抽取ViewHolder,打造萬能ViewHolder(因為寫ListView時寫了兩個步驟,RecyclerView就直接寫一個步驟了)
- 建立CommonRecyclerViewHolder
public class CommonRecyclerViewHolder extends RecyclerView.ViewHolder {
private View mItemView;
private SparseArray<View> mViews;
public CommonRecyclerViewHolder(@NonNull View itemView) {
super(itemView);
mViews = new SparseArray<>();
this.mItemView = itemView;
}
public View getView(int viewId) {
View view = mViews.get(viewId);
if(view == null){
view = mItemView.findViewById(viewId);
mViews.put(viewId,view);
}
return view;
}
public CommonRecyclerViewHolder setText(int viewId,String text){
((TextView)getView(viewId)).setText(text);
return this;
}
public CommonRecyclerViewHolder setImageResource(int viewId,int resId){
((ImageView)getView(viewId)).setImageResource(resId);
return this;
}
//這裡還可以根據項目需要添加很多方法
}
- 修改PersonRecyclerAdapter
public class PersonRecyclerAdapter extends RecyclerView.Adapter<CommonRecyclerViewHolder> {
private List<Bean> mData;
private Context mContext;
public void setData(List<Bean> mData) {
this.mData = mData;
this.notifyDataSetChanged();
}
public PersonRecyclerAdapter(Context mContext) {
this.mContext = mContext;
}
@NonNull
@Override
public CommonRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
CommonRecyclerViewHolder viewHolder = new CommonRecyclerViewHolder(convertView);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull CommonRecyclerViewHolder viewHolder, int position) {
Bean bean = mData.get(position);
if (bean != null) {
viewHolder.setText(R.id.tv_name,bean.getName());
viewHolder.setText(R.id.tv_address,bean.getAddress());
viewHolder.setText(R.id.tv_age,"年齡:" + bean.getAge());
}
}
@Override
public int getItemCount() {
return (mData == null) ? 0 : mData.size();
}
}
- 運作成功
三、打造萬能CommonRecyclerAdapter(打造過程和ListView打造過程差不多,是以也就用一個步驟來寫了)
- 建立CommonRecyclerAdapter
public abstract class CommonRecyclerAdapter<T> extends RecyclerView.Adapter<CommonRecyclerViewHolder> {
private List<T> mDatas;
private int mLayoutId;
private Context mContext;
public void setDatas(List<T> datas) {
this.mDatas = datas;
this.notifyDataSetChanged();
}
public CommonRecyclerAdapter(int mLayoutId, Context mContext) {
this.mLayoutId = mLayoutId;
this.mContext = mContext;
}
@NonNull
@Override
public CommonRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View convertView = LayoutInflater.from(mContext).inflate(mLayoutId, null);
return new CommonRecyclerViewHolder(convertView);
}
@Override
public int getItemCount() {
return (mDatas == null) ? 0 : mDatas.size();
}
@Override
public void onBindViewHolder(@NonNull CommonRecyclerViewHolder commonRecyclerViewHolder, int i) {
T bean = mDatas.get(i);
convert(commonRecyclerViewHolder,i,bean);
}
public abstract void convert(CommonRecyclerViewHolder viewHolder,int position,T bean);
}
- 修改PersonRecyclerAdapter
public class PersonRecyclerAdapter extends CommonRecyclerAdapter<Bean> {
public void setData(List<Bean> data) {
setDatas(data);
}
public PersonRecyclerAdapter(int layoutId, Context context) {
super(layoutId, context);
}
@Override
public void convert(CommonRecyclerViewHolder viewHolder, int position, Bean bean) {
if (bean != null) {
viewHolder.setText(R.id.tv_name,bean.getName());
viewHolder.setText(R.id.tv_address,bean.getAddress());
viewHolder.setText(R.id.tv_age,"年齡:" + bean.getAge());
}
}
}
- 修改RecyclerActivity
if (mAdapter == null)
mAdapter = new PersonRecyclerAdapter(R.layout.item_list,this);
- 運作成功。
四、總結
- 可以看到,做RecyclerView的萬能Adapter和ListView是差不多的,隻要弄清楚了一個另外一個就很好了解了
- 代碼位址: https://github.com/xiaomei888/baselistadapter/tree/master