ListView的万能适配器
CommomLvAdapter:
public abstract class CommomLvAdapter<T> extends BaseAdapter {
private Context mContext;
private List<T> mDataList;
private int mLayoutId;
public CommomLvAdapter(Context context, List<T> dataList, int layoutId) {
mContext = context;
mDataList = dataList;
mLayoutId = layoutId;
}
public void refreshData(List<T> dataList) {
this.mDataList = dataList;
notifyDataSetChanged();
}
public void deleteList(int position) {
this.mDataList.remove(position);
this.notifyDataSetChanged();
}
@Override
public int getCount() {
return mDataList == null ? 0 : mDataList.size();
}
@Override
public T getItem(int position) {
return mDataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LvViewHolder holder = LvViewHolder.getHolder(mContext, convertView, parent, mLayoutId, position);
T t = mDataList.get(position);
convert(holder, t, position);
return holder.getConvertView();
}
public abstract void convert(LvViewHolder holder, T itemData, int position);
}
LvViewHolder :
public class LvViewHolder {
private final View mConvertView;
//Android开发中官方推荐:当使用HashMap(K, V),如果K为整数类型时,使用SparseArray的效率更高
private SparseArray<View> mViews;
private Context mContext;
protected int mPosition;
protected int mLayoutId;
public LvViewHolder(Context context, View itemView, ViewGroup parent, int position) {
this.mContext = context;
this.mPosition = position;
mConvertView = itemView;
mViews = new SparseArray<>();
mConvertView.setTag(this);
}
public static LvViewHolder getHolder(Context context, View convertView, ViewGroup parent, int layoutId, int position) {
if (convertView == null) {
View itemView = LayoutInflater.from(context).inflate(layoutId, parent, false);
LvViewHolder holder = new LvViewHolder(context, itemView, parent, position);
holder.mLayoutId = layoutId;
return holder;
} else {
LvViewHolder holder = (LvViewHolder) convertView.getTag();
holder.mPosition = position;
return holder;
}
}
public View getConvertView() {
return mConvertView;
}
public int getPosition() {
return mPosition;
}
public int getLayoutId() {
return mLayoutId;
}
public void updatePosition(int position) {
mPosition = position;
}
public <T extends View> T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = mConvertView.findViewById(viewId);
mViews.append(viewId, view);
}
return (T) view;
}
public LvViewHolder setText(int viewId, String text) {
TextView view = getView(viewId);
view.setText(text);
return this;
}
public LvViewHolder setTextColor(int viewId, int color) {
TextView view = getView(viewId);
view.setTextColor(color);
return this;
}
public LvViewHolder setTextColorRes(int viewId, int textColorRes) {
TextView view = getView(viewId);
view.setTextColor(mContext.getResources().getColor(textColorRes));
return this;
}
public LvViewHolder setImageByUrl(int viewId, String imageUrl) {
ImageView view = getView(viewId);
/* Glide.with(mContext).load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.error(R.mipmap.ic_launcher)
.placeholder(R.mipmap.ic_launcher)
.into(view);*/
Glide.with(mContext).load(imageUrl).into(view);
return this;
}
public LvViewHolder setImageResource(int viewId, int resId) {
ImageView view = getView(viewId);
view.setImageResource(resId);
return this;
}
public LvViewHolder setImageDrawable(int viewId, Drawable drawable) {
ImageView view = getView(viewId);
view.setImageDrawable(drawable);
return this;
}
public LvViewHolder setImageBitmap(int viewId, Bitmap bitmap) {
ImageView view = getView(viewId);
view.setImageBitmap(bitmap);
return this;
}
public LvViewHolder setBackgroundColor(int viewId, int color) {
View view = getView(viewId);
view.setBackgroundColor(color);
return this;
}
public LvViewHolder setBackgroundRes(int viewId, int backgroundRes) {
View view = getView(viewId);
view.setBackgroundResource(backgroundRes);
return this;
}
public LvViewHolder setVisible(int viewId, boolean visible) {
View view = getView(viewId);
view.setVisibility(visible ? View.VISIBLE : View.GONE);
return this;
}
public LvViewHolder setOnClickListener(int viewId, View.OnClickListener listener) {
View view = getView(viewId);
view.setOnClickListener(listener);
return this;
}
public LvViewHolder setOnTouchListener(int viewId, View.OnTouchListener listener) {
View view = getView(viewId);
view.setOnTouchListener(listener);
return this;
}
public LvViewHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) {
View view = getView(viewId);
view.setOnLongClickListener(listener);
return this;
}
}
ListView的多布局
public class MutilLayoutAdapter extends BaseAdapter {
public static final int TYPE1 = 0;// 3种不同的布局
public static final int TYPE2 = 1;
public static final int TYPE3 = 2;
private Context mContext;
private List<UserInfo> mDataList;
private final LayoutInflater mLayoutInflater;
public MutilLayoutAdapter(Context context, List<UserInfo> dataList) {
mContext = context;
mDataList = dataList;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mDataList == null ? 0 : mDataList.size();
}
@Override
public Object getItem(int position) {
return mDataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = mDataList.get(position).getType();
BaseViewHolder baseViewHolder = null;
if (convertView == null) {
switch (type) {
case TYPE1:
convertView = mLayoutInflater.inflate(R.layout.item_list1, parent, false);
baseViewHolder = new ViewHolder1(convertView);
break;
case TYPE2:
convertView = mLayoutInflater.inflate(R.layout.item_list2, parent, false);
baseViewHolder = new ViewHolder2(convertView);
break;
case TYPE3:
convertView = mLayoutInflater.inflate(R.layout.item_list3, parent, false);
baseViewHolder = new ViewHolder3(convertView);
break;
}
convertView.setTag(baseViewHolder); //关联convertView和ViewHolder
} else {
baseViewHolder = (BaseViewHolder) convertView.getTag();
}
//填充数据
UserInfo userInfo = mDataList.get(position);
fillData(type, baseViewHolder, userInfo);
return convertView;
}
private void fillData(int type, BaseViewHolder baseViewHolder, UserInfo userInfo) {
switch (type) {
case TYPE1:
fillDataType1(baseViewHolder, userInfo);
break;
case TYPE2:
fillDataType2(baseViewHolder, userInfo);
break;
case TYPE3:
fillDataType3(baseViewHolder, userInfo);
break;
}
}
private void fillDataType1(BaseViewHolder baseViewHolder, UserInfo userInfo) {
ViewHolder1 holder = (ViewHolder1) baseViewHolder;
holder.tvName.setText(userInfo.getName());
}
private void fillDataType2(BaseViewHolder baseViewHolder, UserInfo userInfo) {
ViewHolder2 holder = (ViewHolder2) baseViewHolder;
holder.tvName.setText(userInfo.getName());
holder.tvDesc.setText(userInfo.getDesc());
}
private void fillDataType3(BaseViewHolder baseViewHolder, UserInfo userInfo) {
ViewHolder3 holder = (ViewHolder3) baseViewHolder;
holder.tvName.setText(userInfo.getName());
holder.tvDesc.setText(userInfo.getDesc());
holder.tvTime.setText(userInfo.getTime());
}
/**
* 返回某個位置item布局类型
*
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
return mDataList.get(position).getType();
}
/**
* 返回item布局类型的个数
*
* @return
*/
@Override
public int getViewTypeCount() {
return 3;
}
static class BaseViewHolder {
}
static class ViewHolder1 extends BaseViewHolder {
private TextView tvName;
public ViewHolder1(View convertView) {
tvName = convertView.findViewById(R.id.tv_name);
}
}
static class ViewHolder2 extends BaseViewHolder {
private TextView tvName;
private TextView tvDesc;
public ViewHolder2(View convertView) {
tvName = convertView.findViewById(R.id.tv_name);
tvDesc = convertView.findViewById(R.id.tv_desc);
}
}
static class ViewHolder3 extends BaseViewHolder {
private TextView tvName;
private TextView tvDesc;
private TextView tvTime;
public ViewHolder3(View convertView) {
tvName = convertView.findViewById(R.id.tv_name);
tvDesc = convertView.findViewById(R.id.tv_desc);
tvTime = convertView.findViewById(R.id.tv_time);
}
}
}
public class MainActivity extends AppCompatActivity {
private ListView mListView;
private List<UserInfo> mDataList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.listview);
Random r = new Random();
for (int i = 1; i <= 50; i++) {
int type = r.nextInt(3); //随机设置类型
UserInfo userInfo = new UserInfo();
userInfo.setName("标题" + i);
userInfo.setDesc("这是一段描述内容");
userInfo.setTime("2019-03-14");
userInfo.setType(type);
mDataList.add(userInfo);
}
MutilLayoutAdapter mutilLayoutAdapter = new MutilLayoutAdapter(this, mDataList);
mListView.setAdapter(mutilLayoutAdapter);
}
}
ListView多布局适配器的封装
public class CommomMultiLvAdapter<T> extends BaseAdapter {
protected Context mContext;
protected List<T> mDatas;
private ItemViewDelegateManager mItemViewDelegateManager;
public CommomMultiLvAdapter(Context context, List<T> datas) {
this.mContext = context;
this.mDatas = datas;
mItemViewDelegateManager = new ItemViewDelegateManager();
}
public CommomMultiLvAdapter addItemViewDelegate(ItemViewDelegate<T> itemViewDelegate) {
mItemViewDelegateManager.addDelegate(itemViewDelegate);
return this;
}
private boolean useItemViewDelegateManager() {
return mItemViewDelegateManager.getItemViewDelegateCount() > 0;
}
@Override
public int getViewTypeCount() {
if (useItemViewDelegateManager()) {
return mItemViewDelegateManager.getItemViewDelegateCount();
}
return super.getViewTypeCount();
}
@Override
public int getItemViewType(int position) {
if (useItemViewDelegateManager()) {
int viewType = mItemViewDelegateManager.getItemViewType(mDatas.get(position), position);
return viewType;
}
return super.getItemViewType(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(mDatas.get(position), position);
int layoutId = itemViewDelegate.getItemViewLayoutId();
LvViewHolder viewHolder = null;
if (convertView == null) {
View itemView = LayoutInflater.from(mContext).inflate(layoutId, parent, false);
viewHolder = new LvViewHolder(mContext, itemView, parent, position);
viewHolder.mLayoutId = layoutId;
onViewHolderCreated(viewHolder, viewHolder.getConvertView());
} else {
viewHolder = (LvViewHolder) convertView.getTag();
viewHolder.mPosition = position;
}
convert(viewHolder, getItem(position), position);
return viewHolder.getConvertView();
}
protected void convert(LvViewHolder viewHolder, T item, int position) {
mItemViewDelegateManager.convert(viewHolder, item, position);
}
public void onViewHolderCreated(LvViewHolder holder, View itemView) {
}
@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;
}
}
public interface ItemViewDelegate<T> {
int getItemViewLayoutId();
boolean isForViewType(T item, int position);
void convert(LvViewHolder holder, T t, int position);
}
public class ItemViewDelegateManager<T> {
SparseArrayCompat<ItemViewDelegate<T>> delegates = new SparseArrayCompat();
public int getItemViewDelegateCount() {
return delegates.size();
}
public ItemViewDelegateManager<T> addDelegate(ItemViewDelegate<T> delegate) {
int viewType = delegates.size();
if (delegate != null) {
delegates.put(viewType, delegate);
viewType++;
}
return this;
}
public ItemViewDelegateManager<T> addDelegate(int viewType, ItemViewDelegate<T> delegate) {
if (delegates.get(viewType) != null) {
throw new IllegalArgumentException(
"An ItemViewDelegate is already registered for the viewType = "
+ viewType
+ ". Already registered ItemViewDelegate is "
+ delegates.get(viewType));
}
delegates.put(viewType, delegate);
return this;
}
public ItemViewDelegateManager<T> removeDelegate(ItemViewDelegate<T> delegate) {
if (delegate == null) {
throw new NullPointerException("ItemViewDelegate is null");
}
int indexToRemove = delegates.indexOfValue(delegate);
if (indexToRemove >= 0) {
delegates.removeAt(indexToRemove);
}
return this;
}
public ItemViewDelegateManager<T> removeDelegate(int itemType) {
int indexToRemove = delegates.indexOfKey(itemType);
if (indexToRemove >= 0) {
delegates.removeAt(indexToRemove);
}
return this;
}
public int getItemViewType(T item, int position) {
int delegatesCount = delegates.size();
for (int i = delegatesCount - 1; i >= 0; i--) {
ItemViewDelegate<T> delegate = delegates.valueAt(i);
if (delegate.isForViewType(item, position)) {
return delegates.keyAt(i);
}
}
throw new IllegalArgumentException(
"No ItemViewDelegate added that matches position=" + position + " in data source");
}
public void convert(LvViewHolder holder, T item, int position) {
int delegatesCount = delegates.size();
for (int i = 0; i < delegatesCount; i++) {
ItemViewDelegate<T> delegate = delegates.valueAt(i);
if (delegate.isForViewType(item, position)) {
delegate.convert(holder, item, position);
return;
}
}
throw new IllegalArgumentException(
"No ItemViewDelegateManager added that matches position=" + position + " in data source");
}
public int getItemViewLayoutId(int viewType) {
return delegates.get(viewType).getItemViewLayoutId();
}
public int getItemViewType(ItemViewDelegate itemViewDelegate) {
return delegates.indexOfValue(itemViewDelegate);
}
public ItemViewDelegate getItemViewDelegate(T item, int position) {
int delegatesCount = delegates.size();
for (int i = delegatesCount - 1; i >= 0; i--) {
ItemViewDelegate<T> delegate = delegates.valueAt(i);
if (delegate.isForViewType(item, position)) {
return delegate;
}
}
throw new IllegalArgumentException(
"No ItemViewDelegate added that matches position=" + position + " in data source");
}
public int getItemViewLayoutId(T item, int position) {
return getItemViewDelegate(item, position).getItemViewLayoutId();
}
}
使用
public class MainActivity extends AppCompatActivity {
private ListView mListView;
private List<UserInfo> mDataList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.listview);
Random r = new Random();
for (int i = 1; i <= 50; i++) {
int type = r.nextInt(3); //随机设置类型
UserInfo userInfo = new UserInfo();
userInfo.setName("标题" + i);
userInfo.setDesc("这是一段描述内容");
userInfo.setTime("2019-03-14");
userInfo.setType(type);
mDataList.add(userInfo);
}
MultiAdapter multiAdapter=new MultiAdapter(this,mDataList);
mListView.setAdapter(multiAdapter);
}
class MultiAdapter extends CommomMultiLvAdapter<UserInfo> {
public MultiAdapter(Context context, List<UserInfo> datas) {
super(context, datas);
addItemViewDelegate(new Type1ItemDelagate());
addItemViewDelegate(new Type2ItemDelagate());
addItemViewDelegate(new Type3ItemDelagate());
}
}
class Type1ItemDelagate implements ItemViewDelegate<UserInfo> {
@Override
public int getItemViewLayoutId() {
return R.layout.item_list1;
}
@Override
public boolean isForViewType(UserInfo item, int position) {
return false;
}
@Override
public void convert(LvViewHolder holder, UserInfo userInfo, int position) {
holder.setText(R.id.tv_name, userInfo.getName());
}
}
class Type2ItemDelagate implements ItemViewDelegate<UserInfo> {
@Override
public int getItemViewLayoutId() {
return R.layout.item_list2;
}
@Override
public boolean isForViewType(UserInfo item, int position) {
return false;
}
@Override
public void convert(LvViewHolder holder, UserInfo userInfo, int position) {
holder.setText(R.id.tv_name, userInfo.getName());
holder.setText(R.id.tv_desc, userInfo.getDesc());
}
}
class Type3ItemDelagate implements ItemViewDelegate<UserInfo> {
@Override
public int getItemViewLayoutId() {
return R.layout.item_list3;
}
@Override
public boolean isForViewType(UserInfo item, int position) {
return false;
}
@Override
public void convert(LvViewHolder holder, UserInfo userInfo, int position) {
holder.setText(R.id.tv_name, userInfo.getName());
holder.setText(R.id.tv_desc, userInfo.getDesc());
holder.setText(R.id.tv_time, userInfo.getTime());
}
}
}
参考博客
https://blog.youkuaiyun.com/lmj623565791/article/details/38902805