文档章节

【Android】RecyclerView

xesam
 xesam
发布于 2014/12/02 13:47
字数 916
阅读 3115
收藏 6

#RecyclerView

##RecyclerView简明

RecyclerView 在v7.21+包中,是一个用来展示大量数据的组件,或者说,就是ListView的改善版本(注:现阶段的功能没有ListView完善,因此想完全取代ListView的话并不明智)。 相比ListView,RecyclerView的扩展性更好,因此也更适合与android新曾的组件配合使用,这样使用起来更得心应手。

RecyclerView与ListView的原理差不多,本质上都是以适配器为核心。只不过ListView缓存的是view,viewHolder附着在view上,而RecyclerView缓存的是viewHolder,view包含在viewHolder内。

如果我们将ListViewAdapter稍作修改,也可以实现这种设计:

abstract class LvAdapter<VH extends LvAdapter.ViewHolder> extends BaseAdapter {

    public class ViewHolder {

        private View view;

        public ViewHolder(View view) {
            this.view = view;
        }

        public View getView() {
            return view;
        }
    }

    @Override
    public int getCount() {
        return 0;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        VH vh = getViewHolder();
        onBindViewHolder(vh, position);
        return vh.getView();
    }

    public abstract VH getViewHolder();

    public abstract void onBindViewHolder(VH holder, int position);
}

这样有点不直观,所以更进一步,ListView的Adapter可以更抽象,将数据绑定方法交给viewHolder,这样adapter的工作就更单纯一点.

一个方便的ListViewAdapter可以参考base-adapter-helper

##RecyclerView使用

####适配器 既然都是以适配器为核心,因此,只需要写好适配器就行了:

class RvViewHolder extends RecyclerView.ViewHolder {

    public TextView tv;

    public RvViewHolder(View itemView) {
        super(itemView);
        tv = (TextView) itemView.findViewById(R.id.tv);
    }
}

class RvAdapter extends RecyclerView.Adapter<RvViewHolder> {

    Context context;
    String[] items;

    public RvAdapter(Context context, String[] items) {
        this.context = context;
        this.items = items;
    }

    @Override
    public RvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.apt_v7_recycler_view, parent, false);
        return new RvViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RvViewHolder holder, int position) {
        holder.tv.setText(items[position]);
    }

    @Override
    public int getItemCount() {
        return items.length;
    }
}

rv.setAdapter(new RvAdapter(this, new String[]{
        "A", "B", "C", "D",
        "A", "B", "C", "D",
        "A", "B", "C", "D",
        "A", "B", "C", "D",
        "A", "B", "C", "D",
        "A", "B", "C", "D",
        "A", "B", "C", "D",
        "A", "B", "C", "D",
        "A", "B", "C", "D",
        "A", "B", "C", "D",
        "A", "B", "C", "D",
        "A", "B", "C", "D",
        "A", "B", "C", "D"
}));
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayout.VERTICAL);
rv.setLayoutManager(linearLayoutManager);

####布局管理器 与 横向列表

RecyclerView的另一个特点就是布局管理器(LayoutManager),个人觉得的一个比较方便的地方就是,终于可以方便的实现横向列表</em>了!布局管理的作用就是负责摆放view以及回收view。 类似的

int findFirstVisibleItemPosition();
int findLastVisibleItemPosition();

方法也在布局管理器中

####设置item动画 rv.setItemAnimator(ItemAnimator);

####分割线 由于RecyclerView的布局不固定,因此没有像ListView那样直接设定divider的方式,这些可能需要自己实现。一个简单粗鲁的纵向列表分割线如下:

rv.addItemDecoration(new RecyclerView.ItemDecoration() {

    Paint paint = new Paint();

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(c, parent, state);
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
        for (int i = 0, size = parent.getChildCount(); i < size; i++) {
            View child = parent.getChildAt(i);
            c.drawLine(child.getLeft(), child.getBottom(), child.getRight(), child.getBottom(), paint);
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
    }
});

还可以参考:DividerItemDecoration

####绑定事件

RecyclerView 没有 ListView 的 OnItemClick 等方法,所以,类似方法需要自己处理。

  1. 可以直接给itemView或者其子view绑定事件,绑定可以在viewHolder中进行事件绑定,也可以在adapter中进行。 不过viewHolder中无法直观获取到原始的Item数据,需要进一步的处理(比如给itemView设置tag)才能实现获取原始数据的目的,所以怎么使用需要自己权衡。

    class RvViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

     public TextView tv;
    
     public RvViewHolder(View itemView) {
         super(itemView);
         tv = (TextView) itemView.findViewById(R.id.tv);
         itemView.setTag(this);
         itemView.setOnClickListener(this);
     }
    
     @Override
     public void onClick(View v) {
         int vId = v.getId();
         if (vId == R.id.tv) {
             Toast.makeText(itemView.getContext(), getPosition() + "", Toast.LENGTH_SHORT).show();
         }
     }
    

    }

  2. 可以使用

     addOnItemTouchListener(RecyclerView.OnItemTouchListener listener)
    

    来进行全局处理。当然,缺点就是需要处理事件细节,比较繁琐。

##demo demo

Android分享 Q群:315658668

© 著作权归作者所有

xesam
粉丝 30
博文 77
码字总数 44843
作品 0
武汉
程序员
私信 提问
Android开发过程中的坑及解决方法收录

  1.某个控件要放在Linearlayout布局的底部(底部导航条)      <LinearLayout      android:layoutwidth="matchparent"      android:orientation="vertical"      andro......

SEOwhywhy
2018/12/08
16
0
RecyclerView、NestedScrollView嵌套子RecyclerView焦点抢夺引起子元素显示位置异常

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/82626837 RecyclerView、NestedScrollView嵌套子RecyclerView焦点抢夺引起子元素显示位...

zhangphil
2018/09/11
0
0
Fragment放到RecyclerView的item布局中

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/zp000123/article/details/81086710 效果图: 问题 1. 动态...

shzwork
12/06
10
0
Android 5.0+(RecycleView、CardView、Palette)

Android L 开发者预览支持库提供两个新的Widgets,RecyclerView和CardView。使用这两个Widgets可以显示复杂的Listview和卡片布局,这两个Widgets默认使用Material design。 RecyclerView R...

让代码飞一会
2015/07/27
1K
0
Android取消RecyclerView、ListView、ScrollView、HorizontalScrollView滑动到边缘闪现灰白色水波纹动画

Android取消RecyclerView、ListView、ScrollView、HorizontalScrollView滑动到边缘闪现灰白色水波纹动画 标准的Android RecyclerView、ListView、ScrollView、HorizontalScrollView滑动到边缘...

zhangphil
2018/05/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

5 分钟快速学习,缓存一致性优化方案!

缓存操作 读缓存 读缓存可以分为两种情况命中(cache hit)和未命中(cache miss): 缓存命中 首先从缓存中获取数据 将缓存中的数据返回 缓存未命中 首先从缓存中获取数据 此时缓存未命中,...

架构文摘
13分钟前
4
0
【从入门到放弃-ZooKeeper】ZooKeeper实战-分布式锁-升级版

设计 我们依然实现java.util.concurrent.locks.Lock接口。 和上一文中实现方式不同的是,我们使用ZooKeeper的EPHEMERAL_SEQUENTIAL临时顺序节点。 当首次获取锁时,会创建一个临时节点,如果...

阿里云官方博客
14分钟前
3
0
inner join 和 union all 做的汇总区别

inner join CREATE OR REPLACE VIEW M_INVENT_BARCODE_DIFF ASSELECT "INV_PART_NO","INV_ONHAND","INV_LOCATION","PART_NO","BAR_ONHAND","BAR_LOCATION"FROM (SELECT m.part_no AS......

donald121
20分钟前
4
0
EMC 设计经验总结

整体布局 1、高速、中速、低速电路要分开; 2、强电流、高电压、强辐射元器件远离弱电流、低电压、敏感元器件; 3、模拟、数字、电源、保护电路要分开; 4 、多层板设计,有单独的电源和地平...

demyar
24分钟前
3
0
支付宝高级Java现场面试35题:页锁+死锁+集群+雪崩+负载等

年底是冲刺大厂的良机,这个时间点大部分人都在观望年终奖与加薪幅度,看情况再伺机而动,人才市场的竞争反而没那么激烈。 获悉到支付宝近期有HC放出,我通过内推渠道,得到了支付宝的面试机...

mikechen优知
26分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部