善于封装,提高开发效率,减少ctrl+c、ctrl+v,学会tou lan
Recycleview的基本用法
public class TestActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private List<String> mDatas;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initRecyclerView();
}
private void initRecyclerView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mDatas = new ArrayList<>();
for (int i = 0; i < 20; i++) {
mDatas.add("item data is " + i);
}
mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplication()));
MyAdapter adapter = new MyAdapter();
mRecyclerView.setAdapter(adapter);
}
class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_textview, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.textview.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView textview;
public MyViewHolder(View itemView) {
super(itemView);
textview = (TextView) itemView.findViewById(R.id.item_textview);
}
}
}
}
项目中有N个RecyclerView,岂不是要写N个Viewholder和N个Adapter(岂不是要累死),封装一个BaseAdapter减少代码量,还是很有必要的。
1.关于ViewHolder的封装
先看看ViewHolder都有哪些作用(提炼出来)1.onCreateViewHolder里面new Viewholder 2.绑定viewId和onBindViewHolder里面赋值
public class ViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> mViews;
private View itemView;
public ViewHolder(View itemView) {
super(itemView);
mViews = new SparseArray<>();
this.itemView = itemView;
}
public ViewHolder get(Context context, ViewGroup parent, int layoutId) {
View view = LayoutInflater.from(context).inflate(layoutId, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
/**
* 绑定viewId(泛型方法)
* @param viewId
* @param <T>
* @return
*/
public <T extends View> T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = itemView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
/**
* 给TextView赋值 根据项目需求你还可以添加setImageView、点击事件等等
* @param viewId
* @param text
* @return
*/
public ViewHolder setText(int viewId, String text) {
TextView textView = getView(viewId);
textView.setText(text);
return this;
}
}
2.BaseAdapter
public abstract class CommonAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
private List<T> mDatas;
private Context mContext;
private int layoutId;
public CommonAdapter(Context mContext, List<T> mDatas, int layoutId) {
this.mDatas = mDatas;
this.mContext = mContext;
this.layoutId = layoutId;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
/**
* 创建Viewholder,绑定布局id,内部实现
*/
ViewHolder holder = ViewHolder.get(mContext, parent, layoutId);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
/**
* 对于控件的赋值,需要子类自己实现,这里我们用抽象方法
*/
convert(holder, mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas == null ? 0 : mDatas.size();
}
public abstract void convert(ViewHolder holder, T t);
}
3.简单使用
mRecyclerView.setAdapter(new CommonAdapter<String>(this, mDatas, R.layout.item_textview) {
@Override
public void convert(ViewHolder holder, String o) {
holder.setText(R.id.item_textview, o);
}
});-----so easy
网友评论