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

来源:互联网 发布:淘宝店铺入口图 编辑:程序博客网 时间:2024/05/01 06:02

有时候我们希望的在列表中把数据按照一定的逻辑分类显示,比如按照字母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);        }
0 0
原创粉丝点击