listView多个布局复用
来源:互联网 发布:汉诺塔算法复杂性 编辑:程序博客网 时间:2024/05/16 11:14
1、关于listView多个布局复用的问题,主要是重写一个方法,通过该方法在不同的位置设置不同的类型,这里共两种类型,不同条件是返回不同的类型,然后在getview方法中通过不同的类型加载不同的布局,具体的逻辑在后面的代码中实现
获取每一个item的类型@Overridepublic 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。
0 0
- listView多个布局复用
- ListView布局多个样式
- ListView使用多个布局
- ListVIew 中加载多个item 布局的covertView复用问题
- 在ListView中使用多个布局
- android 多个layout布局listView
- ListView显示多个的布局
- 一个ListView使用多个布局文件
- listview多个不同的item布局
- Android ListView通用单个多个布局
- ListView中含有多个item布局的处理
- Android中关于listview填充多个布局
- Android--ListView多布局的复用简介
- Android ListView多布局复用ArrayIndexOutOfBoundsException问题
- ListView 多布局
- ListView多布局加载
- ListView的多布局
- ListView的多布局
- mysql修改密码
- Android的WebView
- [LeetCode] 148. Sort List java
- OC 中方法名为什么被称作选择器(selector)?
- 空心菱形的输出
- listView多个布局复用
- c#学习笔记
- 图解GitHub和SourceTree入门教程
- 基于WCF的RESTFul WebAPI如何对传输内容实现压缩
- ActiveMQ简单介绍+简单实例
- [LeetCode] 41. First Missing Positive java
- IL指令
- oracle要掌握的程度
- POI之经典案例--按列名导出excel