listView多个布局复用

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不羁的闰土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值