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
原创粉丝点击