RecyclerView笔记


layout: post
title: "新控件笔记"
date: 2016-08-16 12:16:58 +0800
comments: true
categories:



RecyclerView##

  • 此控件还需要在app的gradle中添加依赖才能使用
  • RecyclerView 控件是用来替换ListView的,此控件并不会像ListView默认加分割线,而且并没有setOnItemClickListener()方法。
  • RecyclerView控件主要由这几部分构成
    • LinearLayoutManager:主要用于制Recyclerview的子项之间的放置方式。

        layoutManager = new                       LinearLayoutManager(context);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecycler.setLayoutManager(layoutManager);
      
    • 自定义适配器类,继承RecyclerView.Adapter<MHolder> ,泛型放入的为子项布局view的持有对象类。

        public HomeAdapter(Context context,List<String> list){
        this.context = context;
        this.dataList = list;
        }
      
        @Override
        public HomeHolder  onCreateViewHolder(ViewGroup parent, int viewType) {
           View view = LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1,parent,false);
        view.setOnClickListener(this); //此为注册子项布局View的点击监听者。
        return new HomeHolder(view);
        } //此方法用于创建子项布局View持有者对象。
      
        @Override
        public void  onBindViewHolder(HomeHolder holder, int position) {
        String content =  dataList.get(position);
        holder.setTextView(content);
        holder.itemView.setTag(content);  //用于封存子View 对应的实体类对象。
        } //此方法呢在RececlerView绘制子项布局View 时就会回调到,所以其中的主要逻辑用于设置View 内容。
      
        @Override
        public int getItemCount() {
            return dataList.size();
        }  //此方法用于表示RececlerView显示多少个子项布局内容。所以一般返回存放实体类的List容器.size()就能显示全部了。
      
    • 自定义View持有类,继承于RecyclerView.ViewHolder,用于持有子项布局View对象,提高RececlerView的效率。

Insert Your Code Here.
``` private TextView textView;
    public HomeHolder(View itemView) {
        super(itemView);
        textView =(TextView) itemView.findViewById(android.R.id.text1);
    } //构造函数用于获取子项布局下的UI控件
    public void setTextView(String text){
        textView.setText(text);
    }
    
    + 子项布局用于RecyclerView的单项UI。
    + List容器用于放置实体类。实体类单项UI的资源对象。当List容器里的对象数发生改变了,只需调用mAdapter.mAdapter.notifyDataSetChanged(),新的内容就能绘制到屏幕上了。

+ 当要在RececlerView中实现多Item布局时呢,就需要注意使用onCreateViewHolder(ViewGroup parent,int viewType)的第二参数,可以根据ViewType来决定创建哪个ViewHolder。用getItemViewType()设置什么条件(位置)下返回 哪个值并传给ViewType。然后到onBindViewHolder( )方法下去对当前的holder实例进行判断。getItemViewType(int position)方法表示position值的子项视图是什么。getItemViewType()方法会当有子项视图绘制时是都会被调用,如返回的是一个新值(返回到ViewType中,跟之前对比不同),就会去回调onCreateViewHolder( )方法创建新的ViewHolder对象。


      //列表元素private static final int TYPE_ITEM = 0;
      //脚布局private static final int TYPE_FOOTER = 1;  
      @Override
      public RecyclerView.ViewHolder  onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_ITEM) {
            View root = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.layout_news_item, parent, false);
            return new ItemViewHolder(root);
        } else {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.layout_listview_footer, null);
            view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT));
            return new FooterViewHolder(view);
        }
      }

      @Override
      public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof TextViewHolder) {
            ((TextViewHolder) holder).mTextView.setText(mTitles[position]);
        } else if (holder instanceof ImageViewHolder) {
            ((ImageViewHolder) holder).mTextView.setText(mTitles[position]);
        }
      }
      @Override
      public int getItemViewType(int position) {
        return position > 50 ?  TYPE_ITEM:TYPE_FOOTER;         
      }
+ 当子项布局的高度是固定时,调用此 mRecycler.setHasFixedSize(true); 可提高性能。

+ 因Recycler默认子项布局之间没有分割线,所以这条分割线就需要,在编写子项布局xml文件时加入。
如子项布局之间的排放是垂直的话,分割线以横线的形式放置,如子项布局之间的排放是水平的话,分割线以竖线的形式放置。

+ 因Recycler默认没有每个项目的点击事件接口。所以需要到Adapter中添加,不能直接在Recycler中的onClick中加入,会破化代码的逻辑。
    + 在适配器类的中onCreatViewHolder()中为每个子项View注册setOnClickListener(),并在Onclik()中回调公开ItemClick接口,并把子项布局的实体类传给调用者,调用者在实体类写自己的逻辑
            
             @Overridepublic void onBindViewHolder(HomeHolder holder, int position) {   
             String content = dataList.get(position);
             holder.setTextView(content);            
             holder.itemView.setTag(content); //把item对应的实体类传给itemView,方便点击事件发生时得到对应的资源。
           }

            public static interface  OnRecyclerViewItemClick{
                void OnItemClick(View v,String data);
            }  
            @Override
            public void onClick(View view) {
            if(mOnItemClick != null){
            mOnItemClick.OnItemClick(view,(String) view.getTag());
                }
            }

            public void             setOnItemClickListener(OnRecyclerViewItemClick listener){
                mOnItemClick = listener;
            }//外部接口。
    
### SwipeRefreshLayout
   + 这是一个刷新布局控件,意为此布局下的控件当有下拉滑动动作时,就能产生刷新事件。
            mRefreshl.setOnRefreshListener(this);
            @Override
            public void onRefresh() {
            if(LEVE_L == 0 ){
            queryProvince();
            }else if(LEVE_L == 1){
            queryCounty(false);
            }
            mRefreshl.postDelayed(new Runnable() {
            @Override
            public void run() {
                if(LEVE_L == 0 )
                Toast.makeText(context, "刷新市级列表成功", Toast.LENGTH_SHORT).show();
                else
                    Toast.makeText(context, "刷新县级列表成功", Toast.LENGTH_SHORT).show();
                mRefreshl.setRefreshing(false);
            }
           },3000); //此控件呢在变为刷新状态后一定要取消。
          }
    
postDelayed()方法,接收两个参数,第一参数为毫秒时间到执行的任务(默认主线程执行),第二参数为延时的时间。
+ mRefre.setColorSchemeResources( );此接口用于设置旋转条的颜色。可传入一组颜色的id
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容