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方法