文章目录
两者优缺点对比
RecyclerView
封装了ViewHolder,效率更高
可以增加增删item动画,侧滑动画等
支持局部更新,可见才更新,不可见不更新。
有局部刷新方法,可以对少部分进行布局刷新
插件式实现,各个功能模块化,解耦性强,使用起来方便
ListView
listView实现了HeaderView和FooderView方法,可以直接使用
分割线可以直接设置
ListView实现OnItemClickListence和OnItemLongClickListence方法,可以直接使用
RecyclerView
RecycleViewHolder类
public class RecyclerViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> views;
public RecyclerViewHolder(View itemView) {
super(itemView);
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;
}
}
RecyclerViewAdapter类
public abstract class RecyclerViewAdapter<T> extends RecyclerView.Adapter<RecyclerViewHolder> {
private Context context;
private LayoutInflater inflater;
private List<T> dattas;
private int laoutId;
protected OnItemCheckedListener itemCheck;
protected OnItemClickListner itemClick;
private boolean clickFlag = true; //单击事件和长按事件的屏蔽表示
public RecyclerViewAdapter(Context context, List<T> datas, int layoutId){
this.context = context;
this.dattas = datas;
this.laoutId = layoutId;
this.inflater = LayoutInflater.from(context);
}
@NonNull
@Override
public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
RecyclerViewHolder holder = new RecyclerViewHolder(inflater.inflate(laoutId,parent,false));
return holder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position, @NonNull List<Object> payloads) {
bindDataItem(holder,dattas,position,context,payloads,itemClick,itemCheck);
}
@Override
public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {
//bindData(holder,dattas.get(position),position,context);
}
@Override
public int getItemCount() {
return dattas == null?0:dattas.size();
}
protected abstract void bindDataItem(RecyclerViewHolder holder, List<T> data, int position, Context context,
List<Object> payloads,
OnItemClickListner itemClick,
OnItemCheckedListener itemClickOb);
//protected abstract void bindData(RecyclerViewHolder holder,T data, int position,Context context);
public void setOnCheckedListner(OnItemCheckedListener itemCheck){
this.itemCheck = itemCheck;
}
public void setOnItemClickListner(OnItemClickListner itemClick){
this.itemClick = itemClick;
}
/**
* 点击事件
*/
public interface OnItemCheckedListener{
int OnItemCheckedListener(boolean ischecked,int position);
}
/**
* 点击事件
*/
public interface OnItemClickListner{
int OnItemClickListner(View v,int position);
}
}
实现Adapter
public class SeatCemianAdapter extends RecyclerViewAdapter<String> {
public SeatCemianAdapter(Context context, List<String> data){
super(context,data,R.layout.seat_item2);
}
@Override
protected void bindDataItem(RecyclerViewHolder holder, List<String> seat, final
int position, Context context, List<Object> payloads,
final OnItemClickListner itemClick,
final OnItemCheckedListener itemCheck) {
CheckBox checkBox = holder.getView(R.id.checkitem);
checkBox.setText(s);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(itemCheck != null){
itemCheck.OnItemCheckedListener(isChecked,position);
}
}
});
}
}
使用
specialAdapter = new SeatCemianAdapter(context,list);
recycleview.setLayoutManager(
new LinearLayoutManager(context));
recycleview.setAdapter(specialAdapter);
recycleview.setItemAnimator (new DefaultItemAnimator());
specialAdapter.setOnCheckedListner(new RecyclerViewAdapter.OnItemCheckedListener() {
@Override
public int OnItemCheckedListener(boolean ischecked, int position) {
//处理点击事件
return 0;
}
});
ListView
ViewHolder类
public class ViewHolder {
private SparseArray<View> mViews;
private int mPosition;
private View mConvertView;
public ViewHolder(Context context, ViewGroup parent, int layoutId, int position){
this.mPosition = position;
this.mViews = new SparseArray<>();
mConvertView = LayoutInflater.from(context).inflate(layoutId,parent,false);
mConvertView.setTag(this);
}
public static ViewHolder get(Context context,View convertView, ViewGroup parant,int layoutId,int position){
if(convertView == null){
return new ViewHolder(context,parant,layoutId,position);
}else{
ViewHolder holder = (ViewHolder)convertView.getTag();
holder.mPosition = position; //即使ViewHolder是复用的,但是position记得更新一下
return holder;
}
}
/**
* 通过ViewId获取控件
* 使用的是泛型T,返回的是View的子类
*/
public <T extends View> T getView(int viewId){
View view = mViews.get(viewId);
if(view == null){
view = mConvertView.findViewById(viewId);
mViews.put(viewId,view);
}
return (T)view;
}
public View getConvertView(){
return mConvertView;
}
}
ListViewAdapter类
public abstract class ListViewAdapter<T> extends BaseAdapter {
//为了让子类访问,于是将属性设置为protected
protected Context mContext;
protected List<T> mDatas;
protected LayoutInflater mInflater;
private int layoutId; //不同的ListView的item布局肯定不同,所以要把布局单独提取出来
public ListViewAdapter(Context context, List<T> datas, int layoutId){
this.mContext = context;
mInflater = LayoutInflater.from(context);
this.mDatas = datas;
this.layoutId = layoutId;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public T getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//初始化ViewHolder ,使用通用的ViewHolder,一行代码搞定ViewHolder的初始化
ViewHolder holder = ViewHolder.get(mContext,convertView,parent,layoutId, position);
convert(holder,getItem(position));
return holder.getConvertView(); //这一行代码要注意了
}
public abstract void convert(ViewHolder holder ,T t);
}
实现Adapter
public class DeviceListAdapter extends ListViewAdapter<WifiP2pDevice> {
private Context context;
//MyAdapter需要一个Context,通过Context获得Layout.inflater,然后通过inflater加载item的布局
public DeviceListAdapter(Context context, List<WifiP2pDevice> datas) {
super(context, datas, R.layout.equipment_list_item);
this.context = context;
}
@Override
public void convert(ViewHolder holder, WifiP2pDevice device) {
TextView name = (TextView) holder.getView(R.id.item_name);
TextView address = (TextView) holder.getView(R.id.item_address);
name.setText(device.deviceName);
address.setText(device.deviceAddress);
}
}
使用
listViewAdapterWithViewHolder = new DeviceListAdapter(context, devArr);
listView.setAdapter(listViewAdapterWithViewHolder);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
WifiP2pDevice device = devArr.get(i);
itemC.getItemConnection(device,itemdialog);
}
});