UI-RecycleView学习笔记

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布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"> 

    <android.support.v7.widget.RecycleView
        android:id="@+id/news_title_recycle_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>  

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/news_title_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:singleLine="true"
        android:ellipsize="end"
        android:textSize="18sp"/>

</LinearLayout>  

四、一般情况下,会创建一个实体类,表示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<NewsAdapter.NewsViewHolder>{

    private List<News> 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<News> 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方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值