android RecycleView

使用LayoutManager来确定每一个item的排列方式。
为增加和删除项目提供默认的动画效果。
你也可以定义你自己的LayoutManager和添加删除动画,RecyclerView项目结构如下:


image.png

Adapter:使用RecyclerView之前,你需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。
LayoutManager:用来确定每一个item如何进行排列摆放,何时展示和隐藏。回收或重用一个View的时候,LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的View和频繁的调用findViewById方法(与ListView原理类似)。

目前SDK中提供了三种自带的LayoutManager:

LinearLayoutManager
GridLayoutManager
StaggeredGridLayoutManager

RecyclerView 最重要的是实现Adapter,adapter中必须实现的三个方法:
①onCreateViewHolder()
这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。

②onBindViewHolder()
这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。

③getItemCount()
这个方法就类似于BaseAdapter的getCount方法了,即总共有多少个条目。

———————————————————————————————
简单的RecyclerView使用方法

1、添加依赖

compile 'com.android.support:recyclerview-v7:24.2.1'

2、使用RecyclerView

 <android.support.v7.widget.RecyclerView
    android:id="@+id/rv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
 />

3、创建适配器Adapter

 private class MyAdapter extends  RecyclerView.Adapter<MyHolder>{
    private final List<String> list;
    public MyAdapter(){
        list =  new ArrayList<String>();
        for (int i = 0; i < 30; i++) {
            list.add("商品记录" + i)}

}
      //OnCreateViewHolder用来给rv创建缓存的

 public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //参数3:判断条件 true  1.是打气 2.添加到parent
        View view = LayoutInflater.from(getContext()).inflate(R.layout.main_recyclerview_item,parent,false);
        MyHolder holder = new MyHolder(view);
        return holder;
    }
    //给缓存控件设置数据
    public void onBindViewHolder(MyHolder holder, int position) {

        String item = list.get(position);
        holder.textView.setText(item);
        holder.icon.setImageResource(R.drawable.ic_default);
    }
    //获取记录数

  public int getItemCount() {
        return list.size();
  }

4、创建HolderView

  public class MyHolder extends RecyclerView.ViewHolder {
public ImageView icon;
public TextView textView;
//实现的方法
public MyHolder(View itemView) {
    super(itemView);
    icon= (ImageView) itemView.findViewById(R.id.item_iv_icon);
    textView= (TextView) itemView.findViewById(R.id.item_tv_title);
}
}  

5、设置adpater和LayoutManager给Recycleview

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(linearLayoutManager);

    initData();

    MyHomeAdapter adapter = new MyHomeAdapter(list);
    recyclerView.setAdapter(adapter);

    private List<String> list = new ArrayList <String>();
    // 初始化数据
public void initData(){
    for (int i = 0; i < 30 ; i++) {
        list.add("数据"+i);
    }
}
  • 封装RecyclerView通用适配器
    好处:1.数量动态 2.类型不限 Map<Integer,View>
    作用:封装了Adapter编写的冗余代码,提供简洁的基类

①封装了BaseHolder

   //抽取BaseHolder继承RecyclerView.ViewHolder
public class BaseHolder extends RecyclerView.ViewHolder {
//不写死控件变量,而采用Map方式
private HashMap<Integer, View> mViews = new HashMap<>();
public BaseHolder(View itemView) {
    super(itemView);
}
/**
 *获取控件的方法
 */
public<T> T getView(Integer viewId){
    //根据保存变量的类型 强转为该类型
    View view = mViews.get(viewId);
    if(view==null){
       view= itemView.findViewById(viewId);
        //缓存
        mViews.put(viewId,view);
    }
    return (T)view;
}
/**
 *传入文本控件id和设置的文本值,设置文本
 */
public BaseHolder setText(Integer viewId, String value){
    TextView textView = getView(viewId);
    if (textView != null) {
        textView.setText(value);
    }
    return this;
}
/**
 * 传入图片控件id和资源id,设置图片
 */
public BaseHolder setImageResource(Integer viewId, Integer resId) {
    ImageView imageView = getView(viewId);
    if (imageView != null) {
        imageView.setImageResource(resId);
    }
    return this;
}
//...还可以扩展出各种控件。
//Fluent API 链式api  obj.setxxx().setyyy()....
}

②Holder封装好之后,再封装BaseAdapter

 封装的时候,部分参数可以选择由外部的构造函数或者set方法
public class BaseAdapter<T> extends RecyclerView.Adapter<BaseHolder> {
    private List<T> mList = new ArrayList<>();
    private int layoutId;
    public BaseAdapter(int layoutId,List<T> list){
        this.layoutId=layoutId;
        this. mList=list;
    }
    //onCreateViewHolder用来给rv创建缓存
    @Override
    public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       //参数3 判断条件 true  1.打气 2.添加到paraent
        // false 1.打气 (参考parent的宽度)
        View view =   LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
        BaseHolder holder = new BaseHolder(view);
        return holder;
    }
   //onBindViewHolder给缓存控件设置数据
    @Override
    public void onBindViewHolder(BaseHolder holder, int position) {
        T item = mList.get(position);
        convert(holder,item);
    }
protected void convert(BaseHolder holder, T item) {
    //什么都没有做
}
    //获取记录数据
    @Override
    public int getItemCount() {
        return mList.size();
    }
}

③封装之后,继承实现

 **
 *1.extends  把父类的代码继承过来。  可以少写很多代码。
*2.因为是全部拿来的代码,所以不是所有的代码都适合当前。对于不适合当前的代码(方法)
* 我们可选择@Override 覆盖|重写
*/
public class MyHomeAdapter extends BaseAdapter<String> {
   public MyHomeAdapter(List<String> list) {
      super(R.layout.main_recyclerview_item, list);
 }
 @Override
protected void convert(BaseHolder holder, String item) {
      holder.setText(R.id.item_tv_title,item).setImageResource(R.id.image,R.drawable.ic_ default);
   }
}

④封装之后,代码实现

public class MainActivity extends AppCompatActivity {
private List<String> list = new ArrayList <String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycle_view);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(linearLayoutManager);

    initData();

    MyHomeAdapter adapter = new MyHomeAdapter(list);
    recyclerView.setAdapter(adapter);
}


// 初始化数据
public void initData(){
    for (int i = 0; i < 30 ; i++) {
        list.add("数据"+i);
    }
}
}

https://blog.csdn.net/qq_37293612/article/details/54915250

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • 【Android 控件 RecyclerView】 概述 RecyclerView是什么 从Android 5.0...
    Rtia阅读 307,230评论 27 439
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,140评论 25 707
  • 甜蜜又微微苦涩,隐隐约约又有一丝辛辣,这或许就是暗恋的味道。 前几天圣诞节和朋友一起玩桌游,杂七杂八的聊着忽然就说...
    阶上兰亭阅读 364评论 2 3
  • 今年是与好友蓓相识的第15个年头。初认识蓓的时候,她还是一副邻家乖乖女的形象,浓密的大眼睛、白绽的皮肤、乌黑的头发...
    青竹风吟阅读 462评论 2 1
  • 静止,这个世界就在那一刻,怀抱我的年华嘿,女人你是否开始幽伤 突然想,这个冬天早该下一场大雪如絮如被,包裹起岁月里...
    想会飞的猪阅读 276评论 0 5