RecyclerView 联系人排序

来源:互联网 发布:顶级源码 编辑:程序博客网 时间:2024/06/05 06:37

联系人排序  侧边选择栏是第三方库sidebar 地址:https://github.com/kongnanlive/SideBar


adapter.java

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>{    private List<String> list;    private List<String> listAll;    public Adapter(List<String> list){        this.list=list;        listAll=new ArrayList<>();    }    public List<String> getListAll(){        return listAll;    }    @Override    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item,null);        return new ViewHolder(view);    }    @Override    public void onBindViewHolder(ViewHolder holder, int position) {        holder.itemText.setText(list.get(position));    }    @Override    public int getItemCount() {        return list.size();    }    class ViewHolder extends RecyclerView.ViewHolder{        private TextView itemText;        public ViewHolder(View itemView) {            super(itemView);            itemText= (TextView) itemView.findViewById(R.id.item_text);        }    }}

MainActivity.java
public class MainActivity extends AppCompatActivity {    private RecyclerView recyclerView;    private Adapter adapter;    private SideBar sideBar;    private List<String> list,listPinY,listAll;    private LinearLayoutManager linearLayoutManager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        String string="汉字,汉语的书写用文字 ,也被借用于书写日语、朝鲜语/韩语等语言。中国的通用文字和唯一官方文字,也是新加坡的官方文字之一,目前确切历史可以追溯到商朝的甲骨文。在日本语中与平假名、片假名混合使用。汉字也曾经是李氏朝鲜的官方文字之一(15世纪朝鲜世宗国王发明谚文,亦称朝鲜文/韩文),目前韩国只在需要汉字标记以避免词义不明的情况下使用,朝鲜则全部采用谚文拼写。汉字亦称中文字、中国字、国字,属于表意文字的词素音节文字,由汉族发明并改进,是世界上最古老的四大自源文字(两河流域的楔形文字、古埃及的圣书字、中国商朝甲骨文、玛雅文字)之一,亦是其中唯一沿用至今的文字。汉字是世界历史上连续使用时间最长的文字,中国历代皆以汉字为主要官方文字。隶变是汉字发展史上的一个里程碑,汉字发展至汉朝隶书时被取名为“汉字”。汉字的演变过程是:史前符号,商朝的甲骨文,周代的金文、大篆,秦朝的小篆、籀文,汉代的隶书,唐代的楷书(今日所用的手写字体标准),草书,行书。";        list=new ArrayList<>();//保存字符        listPinY=new ArrayList<>();//保存字符的索引字母        listAll=new ArrayList<>();//保存索引字母和字符        for(int i=0;i<string.length()/5;i++){            list.add(string.substring(i*5,(i+1)*5));        }        Collections.sort(list, new Comparator<String>() {            public int compare(String arg0, String arg1) {                //根据字符的拼音排序                return PinyinHelper.getShortPinyin(arg0).compareTo(PinyinHelper.getShortPinyin(arg1));            }        });        for(int i=0;i<list.size();i++){            //将文字和索引字母保存起来            String str=list.get(i);            if(i==0){                //list第一个肯定有索引字母,将索引字母和文字都放入listAll中                String py=PinyinHelper.getShortPinyin(str).substring(0,1);                listAll.add(py);                listAll.add(list.get(i));                listPinY.add(py);//索引字母存入listPinY            }else if(i!=0&&!(PinyinHelper.getShortPinyin(str).substring(0,1).equals(PinyinHelper.getShortPinyin(list.get(i-1)).substring(0,1)))){                //当list不是第一个时并且当前字符拼音首字母与前一个字符的拼音首字母不相等                //则依次将索引字母与字符存入listAll                String py=PinyinHelper.getShortPinyin(str).substring(0,1);                listAll.add(py);                listAll.add(list.get(i));                listPinY.add(py);//存入索引字母            }else {                listAll.add(list.get(i));            }        }        recyclerView= (RecyclerView) findViewById(R.id.recycler);        linearLayoutManager=new LinearLayoutManager(this);        recyclerView.setLayoutManager(linearLayoutManager);        recyclerView.addItemDecoration(new RecycleViewDivider(this, LinearLayoutManager.HORIZONTAL));        adapter=new Adapter(listAll);        recyclerView.setAdapter(adapter);        sideBar= (SideBar) findViewById(R.id.sidebar);        String[] strings=new String[listPinY.size()];//拼音数组 sidebar用到        for(int i=0;i<listPinY.size();i++){            strings[i]=listPinY.get(i);        }        sideBar.setLetters(strings);        sideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() {            @Override            public void onTouchingLetterChanged(String s) {                linearLayoutManager.scrollToPositionWithOffset(listAll.indexOf(s),0);            }        });    }    }

当最后使recyclerview滚动到指定位置时,发现了一个问题,使用
recyclerView.smoothScrollToPosition(position);
recyclerView.scrollToPosition(position);
均不能准确的移动到指定位置。当要移动的位置处于屏幕外部的上方时,移动后该位置处于第一行;当要移动的位置处于屏幕外部的下方时,移动后该位置处于最后一行;当要移动的位置处于屏幕内时,recyclerview不移动。
所以,最后用
linearLayoutManager.scrollToPositionWithOffset(int position, int offset);
position表示使该item处于第一行,offset表示该item距recyclerview顶部的像素大小。


代码下载:http://download.csdn.net/detail/u014290233/9587868

0 0
原创粉丝点击