Android RecyclerView

簡介java

  RecyclerView是從Android 5.0開始,谷歌公司推出的一個用於大量數據展現的心控件,在必定程度上能夠代替android

傳統的ListView,更強大,更靈活ide

  RecyclerView是v7包中的新組件,是一個強大的滑動組件,與經典的ListView相比,一樣擁有Item的的回收複用功能,.佈局

RecyclerView的優點:動畫

  RecyclerView並不能徹底替代ListView,二者的使用場景不同,相比於Lisetview的優勢:this

  1.RecyclerView封裝了Viewholder的回收複用,也就是說RecyclerView標準化了Viewholder,編寫Adapter面向的是Viewholder而不是View.spa

  2.提供了一種插拔式的體驗,高度的解耦,異常的靈活,針對一個Item的顯示RecyclerView專門抽取出了相應的類,來控制Item的顯示,使其的擴展性很是強。code

  3.設置佈局管理器以控制Item的佈局方式,橫向、豎向以及瀑布流方式
例如:你想控制橫向或者縱向滑動列表效果能夠經過LinearLayoutManager這個類來進行控制(與GridView效果對應的是GridLayoutManager,與瀑布流對應的還StaggeredGridLayoutManager等)。也就是說RecyclerView再也不拘泥於ListView的線性展現方式,它也能夠實現GridView的效果等多種效果。blog

  4.可設置Item的間隔樣式(可繪製)
經過繼承RecyclerView的ItemDecoration這個類,而後針對本身的業務需求去書寫代碼。繼承

  5.能夠控制Item增刪的動畫,能夠經過ItemAnimator這個類進行控制,固然針對增刪的動畫,RecyclerView有其本身默認的實現。

  可是關於item的點擊和長按事件,須要用戶本身取實現

基本使用:

導入依賴

    implementation 'com.android.support:recyclerview-v7:28.0.0'
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);  
LinearLayoutManager layoutManager = new LinearLayoutManager(this );  
//設置佈局管理器  
recyclerView.setLayoutManager(layoutManager);  
//設置爲垂直佈局,這也是默認的  
layoutManager.setOrientation(OrientationHelper. VERTICAL);  
//設置Adapter  
recyclerView.setAdapter(recycleAdapter);  
 //設置分隔線  
recyclerView.addItemDecoration( new DividerGridItemDecoration(this ));  
//設置增長或刪除條目的動畫  
recyclerView.setItemAnimator( new DefaultItemAnimator());

  在使用RecyclerView的時候,必須指定一個適配器和一個佈局管理器

  適配器Apdater繼承RecyclerView.Adapter類

建立適配器步驟
  1.建立Adapter繼承 RecyclerView.Adapter<VH>的Adapter類(VH是ViewHolder的類名)
  2.建立ViewerHolder,繼承 RecyclerView.ViewHolder實現方式基本與lisetview同樣
  3.實現3個方法
    onCreateViewHolder()
    onBindViewHolder()
    getItemCount()
代碼示例:
package com.hejun.movie;

import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.orhanobut.logger.Logger;

import java.io.Serializable;
import java.util.List;


import butterknife.BindView;
import butterknife.ButterKnife;

class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> {

    private Context context;
    private List<JsonBean.MoviesBean> list;

    public GridAdapter(Context context, List<JsonBean.MoviesBean> list) {
        this.context = context;
        this.list = list;
    }

    /**
     * 加載item佈局
     * @param viewGroup
     * @param i
     * @return
     */
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        View view = LayoutInflater.from(context).inflate(R.layout.griditem, viewGroup, false);
        return new ViewHolder(view);
    }

    /**
     * 加載數據
     * @param viewHolder
     * @param i
     */
    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {

        final JsonBean.MoviesBean moviesBean = list.get(i);
        Glide.with(context).load(moviesBean.getImageUrl()).into(viewHolder.imag);
        viewHolder.itemText.setText(moviesBean.getTitle());
        viewHolder.stars.setRating((float) (moviesBean.getRating().getAverage() / 2));
        viewHolder.itemText2.setText(String.valueOf(moviesBean.getRating().getAverage()));
//        Logger.v(String.valueOf((float) moviesBean.getRating().getAverage() / 2));
        //設置item點擊事件
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //todo: 跳轉詳情頁面
                Intent intent = new Intent(context,DetailsActivity.class);
                intent.putExtra("movies",  moviesBean);
                context.startActivity(intent);
            }
        });
    }

    /**
     * 獲取item數量
     * @return
     */
    @Override
    public int getItemCount() {
        return list.size();
    }

    /**
     * 自定義ViewHolder
     */
    static class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.imag)
        ImageView imag;
        @BindView(R.id.item_text)
        TextView itemText;
        @BindView(R.id.stars)
        RatingBar stars;
        @BindView(R.id.item_text2)
        TextView itemText2;
        ViewHolder(@NonNull View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}
LayoutManager 佈局管理器
  

RecyclerView提供了三種佈局管理器:

  • LinerLayoutManager 以垂直或者水平列表方式展現Item
  • GridLayoutManager 以網格方式展現Item
  • StaggeredGridLayoutManager 以瀑布流方式展現Item
LayoutManager常見API
    canScrollHorizontally();//可否橫向滾動
    canScrollVertically();//可否縱向滾動
    scrollToPosition(int position);//滾動到指定位置

    setOrientation(int orientation);//設置滾動的方向
    getOrientation();//獲取滾動方向

    findViewByPosition(int position);//獲取指定位置的Item View
    findFirstCompletelyVisibleItemPosition();//獲取第一個徹底可見的Item位置
    findFirstVisibleItemPosition();//獲取第一個可見Item的位置
    findLastCompletelyVisibleItemPosition();//獲取最後一個徹底可見的Item位置
    findLastVisibleItemPosition();//獲取最後一個可見Item的位置
相關文章
相關標籤/搜索