1、关于listView多个布局复用的问题,主要是重写一个方法,通过该方法在不同的位置设置不同的类型,这里共两种类型,不同条件是返回不同的类型,然后在getview方法中通过不同的类型加载不同的布局,具体的逻辑在后面的代码中实现
获取每一个item的类型
@Override
public int getItemViewType(int position) {
if (personalNewses.get(position).getIs_read() == 0) {
return WITH_POINT;
}
return WITHOUT_POINT;
}
2、整个adapter如下
/**
* 个人消息适配器
* Created by leven on 2016/11/25.
*/
public class PersonalNewsAdapter extends BaseAdapter {
private static final int WITH_POINT = 0x0;//带红色圆点的布局
private static final int WITHOUT_POINT = 0x1;//不带红色原点的已读消息;
private Context context;
private List<PersonalNews> personalNewses = new ArrayList<>();
public PersonalNewsAdapter(Context context, List<PersonalNews> personalNewses) {
this.context = context;
if (personalNewses != null) {
this.personalNewses = personalNewses;
}
}
public void setPersonalNewses(List<PersonalNews> personalNewses) {
if (personalNewses != null) {
this.personalNewses = personalNewses;
}
}
@Override
public int getCount() {
return personalNewses.size();
}
@Override
public PersonalNews getItem(int i) {
return personalNewses.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public int getItemViewType(int position) {
if (personalNewses.get(position).getIs_read() == 0) {
return WITH_POINT;//isRead为0时返回该类型
}
return WITHOUT_POINT;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder vh_with_point = null;//不同的布局使用不同的ViewHolder对象
ViewHolder vh_without_point = null;
int pointYype = getItemViewType(i);
//根据类型判断选用哪种布局
switch (pointYype) {
case WITH_POINT:
//此处有个技巧,view为空,加载布局时放入else中
if (view != null && view instanceof NewsItemWithPointLayout) {
vh_with_point = (ViewHolder) view.getTag();
} else {
view = LayoutInflater.from(context).inflate(R.layout.item_personal_news, null);
vh_with_point = new ViewHolder();
vh_with_point.tv_title = (TextView) view.findViewById(R.id.tv_title);
vh_with_point.tv_type = (TextView) view.findViewById(R.id.tv_type);
vh_with_point.tv_circle_point = (TextView) view.findViewById(R.id.tv_circle_point);
vh_with_point.tv_priority = (TextView) view.findViewById(R.id.tv_priority);
view.setTag(vh_with_point);
}
if (personalNewses != null && personalNewses.size() > 0) {
vh_with_point.tv_circle_point.setVisibility(View.VISIBLE);
BadgeView badgeView = new BadgeView(context);
badgeView.setBadgeCount(1);
badgeView.setWidth(20);
badgeView.setHeight(20);
badgeView.setTextColor(Color.RED);
badgeView.setBackground(10, Color.RED);
badgeView.setGravity(Gravity.CENTER_VERTICAL);
badgeView.setBadgeMargin(0, 12, 0, 0);
badgeView.setTargetView(vh_with_point.tv_circle_point);
//设置标题
vh_with_point.tv_title.setText(personalNewses.get(i).getTitle());
//设置类型
int type = personalNewses.get(i).getType();
if (type == 0) {
vh_with_point.tv_type.setText("沟通");
} else if (type == 1) {
vh_with_point.tv_type.setText("通知");
} else if (type == 2) {
vh_with_point.tv_type.setText("应答");
}
//设置优先级别
int pri = personalNewses.get(i).getPri();
if (pri == 1) {
vh_with_point.tv_priority.setText("知会");
} else if (pri == 2) {
vh_with_point.tv_priority.setText("普通");
} else if (pri == 3) {
vh_with_point.tv_priority.setText("紧急");
}
}
break;
case WITHOUT_POINT:
if (view != null && view instanceof NewsItemWithoutPointLayout) {
vh_without_point = (ViewHolder) view.getTag();
} else {
view = LayoutInflater.from(context).inflate(R.layout.item_personal_news_not_point, null);
vh_without_point = new ViewHolder();
vh_without_point.tv_title = (TextView) view.findViewById(R.id.tv_title);
vh_without_point.tv_type = (TextView) view.findViewById(R.id.tv_type);
// vh_without_point.tv_circle_point = (TextView) view.findViewById(R.id.tv_circle_point);
vh_without_point.tv_priority = (TextView) view.findViewById(R.id.tv_priority);
view.setTag(vh_without_point);
}
if (personalNewses != null && personalNewses.size() > 0) {
//设置标题
vh_without_point.tv_title.setText(personalNewses.get(i).getTitle());
//设置类型
int type = personalNewses.get(i).getType();
if (type == 0) {
vh_without_point.tv_type.setText("沟通");
} else if (type == 1) {
vh_without_point.tv_type.setText("通知");
} else if (type == 2) {
vh_without_point.tv_type.setText("应答");
}
//设置优先级别
int pri = personalNewses.get(i).getPri();
if (pri == 1) {
vh_without_point.tv_priority.setText("知会");
} else if (pri == 2) {
vh_without_point.tv_priority.setText("普通");
} else if (pri == 3) {
vh_without_point.tv_priority.setText("紧急");
}
}
break;
}
return view;
}
class ViewHolder {
TextView tv_title;
TextView tv_type;
TextView tv_priority;
TextView tv_circle_point;
}
}
总结:ListView的使用较为灵活,加载多个布局时建议使用RecycleView(ViewHolder的优化更好,而且可以水平显示,可以瀑布流),而ListView紧可以垂直显示,有一定的缺陷,推荐RecycleView。