欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

UI-RecycleView学习记录

程序员文章站 2023-01-28 08:03:03
ui-recycleview学习记录 一、导入包 1、 导入recycleview的包 compile 'com.android.support:recycle...

ui-recycleview学习记录

一、导入包

1、 导入recycleview的包

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

2、 或者 导入整个design的包

 compile 'com.android.support:design:27.1.1'

二、activity_main.xml中加入recycleview布局


 

    
  

三、创建recycleview的子布局recycleview_item.xml




    

  

四、一般情况下,会创建一个实体类,表示item布局中的内容

/**
 * 新闻实体类
 */
public class news {
    private string title;
    private string content;
    private  string gettitle(){
        return title;
    }
    private string getcontent(){
        return content;
    }

    public void settitle(string title) {
        this.title = title;
    }

    public void setcontent(string content) {
        this.content = content;
    }
}  

五、创建此recycleview对应的适配器,即创建新的recycleview_adapter类继承自adapter

public class newsadapter extends recyclerview.adapter{

    private list newslist ;

    public class newsviewholder extends recyclerview.viewholder{
        //声明子布局中的各个控件
        private textview textview;

        public newsviewholder(view itemview) {
            super(itemview);
            textview = (textview)itemview.findviewbyid(r.id.news_title_item);
        }

    }

    public newsadapter(list newslist){
        this.newslist = newslist;
    }
    @nonnull
    @override
    public newsadapter.newsviewholder oncreateviewholder(@nonnull viewgroup parent, int viewtype) {
        view view = layoutinflater.from(parent.getcontext()).inflate(r.layout.news_item,parent,false);
        final newsviewholder newsviewholder = new newsviewholder(view);
        //子布局点击事件
        view.setonclicklistener(new view.onclicklistener() {
            @override
            public void onclick(view v) {
                news news = newslist.get(newsviewholder.getadapterposition());
                if(istwopane){
                    //如果是双页模式,则刷新newsfragment中的内容
                    newscontentfragment newscontentfragment = (newscontentfragment) getfragmentmanager()
                            .findfragmentbyid(r.id.news_content_fragment);
                    newscontentfragment.refresh(news.gettitle(),news.getcontent());
                    //如果是单页模式,则直接启动newscontentactivity
                    newscontentactivity.actionstart(getactivity(),news.gettitle(),news.getcontent());
                }
            }
        });
        return newsviewholder;
    }

    @override
    public void onbindviewholder(@nonnull newsadapter.newsviewholder holder, int position) {
        news news = newslist.get(position);
        holder.textview.settext(news.gettitle());
    }

    @override
    public int getitemcount() {
        return newslist.size();
    }


}

1、其中,定义newsadapter类(自己的适配器),由于其继承自recyclerview.adapter,所以需要重写oncreateviewholder()(用来创建viewholder)、onbindviewholder()(用来创建viewholder)、getitemcount()(得到列表的长度)三个方法。

2、adapter类的后面有一个泛型 为viewholder类型。

所以,创建一个newsviewholder类继承自viewholder,写其构造函数时传入参数itemview,并声明此布局中各个控件。 在newsadapter类后面加上刚定义的viewholder的泛型,并修改oncreateviewholder()、onbindviewholder()的返回值类型或者参数类型。

3、oncreateviewholder()方法中,声明并实例化newsviewholder。由于newsviewholder方法需要传入itemview布局,所以要先用layoutinflater填充布局,此时可能需要context信息,我们可以用parent或者重写adapter类的构造方法,传入context参数,一般我们还会将列表内容作为参数传入。

4、onbindviewholder()方法中,通过holder向itemview的控件中填充内容。

5、getitemcount()方法中,返回adapter构造函数传入的列表内容参数的长度。

5、itemview的点击事件,可以放在oncreateviewholder() 或者 onbindviewholder()中,也可以放在adapter类的外面。

当写在adapter类外面时,需要用回调方法: a、在adapter中定义一个接口onitemclicklistenr,其中写onclick方法并传入参数pos。 b、声明接口,并在adapter构造函数中传入接口参数。 c、在adapter外部使用其构造函数是用内部函数完成点击事件。

6、最后在主activity或者fragment中,声明recycleview控件,并调用setlayoutmanager方法设置manager,以及调用setadapter方法设置adapter。

(其中,列表之间如果要有间隔,则此时通过recycleview调用additemdecoration()方法,定义一个mydecoration类继承itemdecoration,通过重写其中的三个方法完成一些功能,其中有一定间隔用getitemoffsets()方法。)

    recyclerview mrecyclerview = (recyclerview)view.findviewbyid(r.id.news_title_recycle_view);
    linearlayoutmanager linearlayoutmanager = new linearlayoutmanager(getactivity());
    mrecyclerview.setlayoutmanager(linearlayoutmanager);
    newsadapter newsadapter = new newsadapter(getnews());
    mrecyclerview.setadapter(newsadapter);

其他形式的recyclerview

一、 当recyclerview要作为水平滚动时:

1、主要通过linearlayoutmanager调用setorientation方法设置为水平滚动

 layoutmanager.setorientation(linearlayoutmanager.horizontal);

2、修改itemview布局文件 为水平距离wrap-content

二、当recyclerview要为网格布局时:

1、主要是setlayoutmanager时,选择网格的manager

 newstitlerecyclerview.setlayoutmanager(new gridlayoutmanager(getactivity(),3));

三 当recyclerview要为瀑布流布局时:

1、主要是setlayoutmanager时,选择瀑布流的manager

newstitlerecyclerview.setlayoutmanager(new staggeredgridlayoutmanager(2,staggeredgridlayoutmanager.vertical)); 
//为瀑布流布局   当后面参数为垂直,前面的2表示两列

使用不同的viewholder在一个recyclerview中展示不同的itemview

1、根据position不同在adapter中重写getitemviewtype方法,

  @override
        public int getitemviewtype(int position) {
            if(position % 2==0){
                return 0;
            }else{
                return 1;
            }
        }

2、 修改oncreateviewholder方法

  view view = layoutinflater.from(parent.getcontext()).inflate(r.layout.news_item, parent, false);
  if(viewtype==0){
            return  new viewholder(view);
        }else{
            return  new viewholder2(view);
        }

3、相应的修改onbindviewholder方法