[关闭]
@zouzhenglu 2017-02-13T13:56:56.000000Z 字数 2164 阅读 52

RecyclerView实现倒序列表

android RecyclerView 倒序


1、写在前面

实现一个聊天界面,就是类似QQ那种,这里是讲一下倒序排列,不实现QQ的各种高级功能

2、ListView 反转数据

只要把数据倒序加入到adapter的数据集中,就可以实现倒序效果

  1. /**
  2. * 回底部
  3. */
  4. public void goBottom() {
  5. handler.post(new Runnable() {
  6. @Override
  7. public void run() {
  8. if (mListView != null)
  9. mListView.setSelection(mListView.getBottom());
  10. }
  11. });
  12. }

这个方案有一下几个问题
1. 显示最后一条需要每次都移动到相应位置
2. 加载更多需要使用下拉刷新的样式实现(如果样式差不多,这里不是问题)

3、RecyclerView

方案一、反转数据

同listview的实现方式,将数据倒序加入,除了具有listview方式的问题

方案二、反转列表

RecyclerView的布局是有LayoutManager控制的,LinearLayoutManager就支持了倒序的功能
1. setStackFromEnd(true)
2. setReverseLayout(true)

3. list.addFirst(item)
在数据上,可以考虑使用上面3的方法,直接添加数据到列表的头部,或者重写adapter的getItem方法,改为get(size-1-position)

ps:这里有勿,直接添加数据即可,不需要加到前面。

  1. RecyclerView rv = (RecyclerView) findViewById(R.id.rv);
  2. LinearLayoutManager layout = new LinearLayoutManager(this);
  3. layout.setStackFromEnd(true);//列表再底部开始展示,反转后由上面开始展示
  4. layout.setReverseLayout(true);//列表翻转
  5. rv.setLayoutManager(layout);
  6. final SimpleRvAdapter adapter = new SimpleRvAdapter(this);
  7. rv.setAdapter(adapter);
  1. fab.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View view) {
  4. adapter.add(String.valueOf(adapter.getItemCount() + 1));
  5. adapter.notifyDataSetChanged();
  6. }
  7. });
  1. public class SimpleRvAdapter extends RecyclerView.Adapter<SimpleRvAdapter.VH> {
  2. private Context mContext;
  3. private LinkedList<String> list = new LinkedList<>();
  4. public SimpleRvAdapter(Context context) {
  5. mContext = context;
  6. }
  7. // public void add(String item) {
  8. // list.addFirst(item);
  9. // }
  10. @Override
  11. public VH onCreateViewHolder(ViewGroup parent, int viewType) {
  12. View view = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false);
  13. return new VH(view);
  14. }
  15. @Override
  16. public void onBindViewHolder(VH holder, final int position) {
  17. holder.textView.setText(list.get(position));
  18. holder.textView.setOnClickListener(new View.OnClickListener() {
  19. @Override
  20. public void onClick(View v) {
  21. Toast.makeText(mContext, "position:" + position, Toast.LENGTH_LONG).show();
  22. }
  23. });
  24. }
  25. @Override
  26. public int getItemCount() {
  27. return list.size();
  28. }
  29. public static class VH extends RecyclerView.ViewHolder {
  30. private TextView textView;
  31. public VH(View itemView) {
  32. super(itemView);
  33. textView = (TextView) itemView.findViewById(R.id.textView);
  34. }
  35. }
  36. }

这样就实现了我们需要的功能,这时候,列表使反转的,bottom在上面,其他的功能正常使用,比如,加载更多自动会跑到上面去
如果在需求上有出入,可以根据需求自定义LayoutManager,这也就是RecyclerView的强大之处,,完全由你自定义的布局

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注