ListView,RecyclerView等列表中实现分层的方法

有时候我们希望的在列表中把数据按照一定的逻辑分类显示,比如按照字母A B C等分层,在IOS中的列表是有section这个概念的,但在Android中这个功能需要自己实现。
基本的思想是在每一个Item项的上方中都添加一个TextView用来显示标头,如果这个标头是第一次出现,则把它显示出来,否则就是GONE了。判断标头是第一次出现的方法如下:先获取position属于哪个section,
再获取此section出现的首位置,然后就是判断position是否是首位置了。第二步中获取到的首位置信息可以用一个map之类的东西缓存起来,因为这个信息会被不断地查询。

    /**
     * 根据ListView的当前位置获取分类的首字母的Char ascii值
     */
    public int getSectionForPosition(int position) {
        return list.get(position).getSortLetters().charAt(0);
    }

    private Map<Integer, Integer> mSectionPositions = new HashMap<>();

    /**
     * 根据分类的首字母的Char ascii值获取其第一次出现该首字母的位置
     */
    public int getPositionForSection(int section) {
        if (mSectionPositions.containsKey(section)) {
            return mSectionPositions.get(section);
        }
        for (int i = 0; i < getCount(); i++) {
            String sortStr = list.get(i).getSortLetters();
            char firstChar = sortStr.toUpperCase().charAt(0);
            if (firstChar == section) {
                mSectionPositions.put(section, i);
                return i;
            }
        }
        return -1;
    }
        // 根据position获取分类的首字母的Char ascii值
        int section = getSectionForPosition(position);
        // 如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现
        if (position == getPositionForSection(section)) {
            viewHolder.tvLetter.setVisibility(View.VISIBLE);
            viewHolder.tvLetter.setText(mContent.getSortLetters());
        } else {
            viewHolder.tvLetter.setVisibility(View.GONE);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值