美文网首页Android 基础知识
RecyclerView实现倒序列表

RecyclerView实现倒序列表

作者: zouzhenglu | 来源:发表于2016-06-16 11:36 被阅读4330次

    1、写在前面

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

    2、ListView 反转数据

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

        /**
         * 回底部
         */
        public void goBottom() {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    if (mListView != null)
                        mListView.setSelection(mListView.getBottom());
                }
            });
        }  
    

    这个方案有一下几个问题

    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:这里有勿,直接添加数据即可,不需要加到前面。

        RecyclerView rv = (RecyclerView) findViewById(R.id.rv);
    
        LinearLayoutManager layout = new LinearLayoutManager(this);
        layout.setStackFromEnd(true);//列表再底部开始展示,反转后由上面开始展示
        layout.setReverseLayout(true);//列表翻转
        rv.setLayoutManager(layout);
    
        final SimpleRvAdapter adapter = new SimpleRvAdapter(this);
        rv.setAdapter(adapter);
    
       fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                adapter.add(String.valueOf(adapter.getItemCount() + 1));
                adapter.notifyDataSetChanged();
    
            }
        });
    
    
    public class SimpleRvAdapter extends RecyclerView.Adapter<SimpleRvAdapter.VH> {
        private Context mContext;
        private LinkedList<String> list = new LinkedList<>();
    
        public SimpleRvAdapter(Context context) {
            mContext = context;
        }
    
      //  public void add(String item) {
      //      list.addFirst(item);
      //  }
    
        @Override
        public VH onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false);
            return new VH(view);
        }
    
        @Override
        public void onBindViewHolder(VH holder, final int position) {
            holder.textView.setText(list.get(position));
            holder.textView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(mContext, "position:" + position, Toast.LENGTH_LONG).show();
                }
            });
        }
    
        @Override
        public int getItemCount() {
            return list.size();
        }
    
        public static class VH extends RecyclerView.ViewHolder {
            private TextView textView;
    
            public VH(View itemView) {
                super(itemView);
                textView = (TextView) itemView.findViewById(R.id.textView);
            }
        }
    }
    

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

    相关文章

      网友评论

        本文标题:RecyclerView实现倒序列表

        本文链接:https://www.haomeiwen.com/subject/dcymdttx.html