1. 程式人生 > >RecyclerView的基本使用(優化圖片載入、設定條目間距、設定Adapter、設定點選事件等)

RecyclerView的基本使用(優化圖片載入、設定條目間距、設定Adapter、設定點選事件等)

首先需要v7包

如果顯示的是圖片,可以用下面這個AutoLoadRecyclerView,他可以在快速滑動時停止載入,避免OOM和記憶體資源浪費

public class AutoLoadRecyclerView extends RecyclerView {
    public AutoLoadRecyclerView(Context context) {
        this(context, null);
    }
    public AutoLoadRecyclerView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public AutoLoadRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setOnScrollListener(new AutoLoadScrollListener(null, true, true));
    }
    /**
     * 配置顯示圖片,需要設定這幾個引數,快速滑動時,暫停圖片載入
     *
     * @param imageLoader   ImageLoader例項物件
     * @param pauseOnScroll
     * @param pauseOnFling
     */
    public void setOnPauseListenerParams(ImageLoader imageLoader, boolean pauseOnScroll, boolean pauseOnFling) {
        setOnScrollListener(new AutoLoadScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
    }
    //載入更多的回撥介面
    public interface onLoadMoreListener {
        void loadMore();
    }
    /**
     * 滑動自動載入監聽器
     */
    private class AutoLoadScrollListener implements OnScrollListener {
        private ImageLoader imageLoader;
        private final boolean pauseOnScroll;
        private final boolean pauseOnFling;
        public AutoLoadScrollListener(ImageLoader imageLoader, boolean pauseOnScroll, boolean pauseOnFling) {
            super();
            this.pauseOnScroll = pauseOnScroll;
            this.pauseOnFling = pauseOnFling;
            this.imageLoader = imageLoader;
        }
        @Override
        public void onScrollStateChanged(int i) {
            //根據newState狀態做處理
            if (imageLoader != null) {
                switch (i) {
                    case 0:
                        imageLoader.resume();
                        break;
                    case 1:
                        if (pauseOnScroll) {
                            imageLoader.pause();
                        } else {
                            imageLoader.resume();
                        }
                        break;
                    case 2:
                        if (pauseOnFling) {
                            imageLoader.pause();
                        } else {
                            imageLoader.resume();
                        }
                        break;
                }
            }
        }
        @Override
        public void onScrolled(int i, int i1) {
        }
    }
}


接下來在佈局檔案中使用它

    <com.robosea.robofish.view.AutoLoadRecyclerView
        android:id="@+id/mRecyclerView"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="94px"
        android:background="@drawable/local_bottom_list_bg"
        android:paddingBottom="13px"
        android:paddingLeft="30px"
        android:paddingRight="30px"
        android:paddingTop="13px"
        android:scrollbars="none"/>
RecyclerView指定縱向排列還是橫向排列是在程式碼中通過佈局管理器設定的,對於RecyclerView來說,必須設定佈局管理器,否則會報異常:


    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$LayoutManager.onMeasure(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.RecyclerView$State, int, int)' on a null object reference


設定佈局管理器,findViewById之後就設定

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        mRecyclerView.setLayoutManager(layoutManager);


那麼RecyclerView條目的間距怎麼設定呢?使用RecyclerView的addItemDecoration方法,
方法引數依靠這個類來設定:

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
    private int space;
    public SpacesItemDecoration(int space) {
        this.space = space;
    }
    @Override
    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
        super.getItemOffsets(outRect, itemPosition, parent);
        outRect.left = space;
        outRect.right = space;
        outRect.bottom = space;
        // Add top margin only for the first item to avoid double space between items
//        if(itemPosition == 0)
//            outRect.top = space;
    }
}


使用的時候定義一個int值,也就是間隔的畫素,傳入SpacesItemDecoration的構造引數就可以了

        int spacingInPixels = 9;
        mRecyclerView.addItemDecoration(new SpacesItemDecoration(spacingInPixels));


最後就是設定Adapter了,以下面這個Adapter為例,我們可以看到展示資料和設定條目的點選事件

public class LocalVideoGalleryAdapter extends RecyclerView.Adapter<LocalVideoGalleryAdapter.ViewHolder> {
    private Activity activity;
    private LayoutInflater mInflater;
    private List<Video> imageInfoList;
    private OnItemClickLitener mOnItemClickLitener;
    public LocalVideoGalleryAdapter(List<Video> imageInfoList, Activity activity) {
        this.imageInfoList = imageInfoList;
        this.activity = activity;
        mInflater = LayoutInflater.from(activity);
    }
    public static class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(View arg0) {
            super(arg0);
        }
        ImageView mImg;
    }
    @Override
    public int getItemCount() {
        return imageInfoList.size();
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = mInflater.inflate(R.layout.activity_index_gallery_item, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(view);
        viewHolder.mImg = (ImageView) view.findViewById(R.id.id_index_gallery_item_image);
        return viewHolder;
    }
    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
        App.imageLoader.displayImage("file://" + imageInfoList.get(i).getPath(), viewHolder.mImg, App.options);
        if (mOnItemClickLitener != null) {
            viewHolder.itemView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    mOnItemClickLitener.onItemClick(viewHolder.itemView, i);
                }
            });
        }
    }
    public interface OnItemClickLitener {
        void onItemClick(View view, int position);
    }
    public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) {
        this.mOnItemClickLitener = mOnItemClickLitener;
    }
}


我們需要寫一個ViewHolder類來繼承RecyclerView.ViewHolder
在onCreateViewHolder方法中找到條目中的View
在onBindViewHolder對條目設定資料,由於RecyclerView和其他View不同,並沒有setOnItemClickLitener這個方法,所以我們需要自己來創造一個setOnItemClickLitener方法。
        做法就是對條目中的View設定點選事件在點選事件中調取我們自己定義的介面OnItemClickLitener中的回撥方法onItemClick
        Activity中使用的時候,讓Activity實現我們自定義的OnItemClickLitener介面,對RecyclerView使用我們自己寫的setOnItemClickLitener方法,傳入this就可以了

mAdapter.setOnItemClickLitener(this);
在getItemCount方法中傳入條目的數量

其他相關:

mRecyclerView.scrollToPosition(position);    //滾動到對應索引位置(當該位置已經展示在螢幕中時,並不會出現滾動效果)



相關推薦

RecyclerView基本使用優化圖片載入設定條目間距設定Adapter設定事件

首先需要v7包 如果顯示的是圖片,可以用下面這個AutoLoadRecyclerView,他可以在快速滑動時停止載入,避免OOM和記憶體資源浪費 public class AutoLoadRecyclerView extends RecyclerView { p

python學習之網站的編寫HTML,CSS,JS二十一----------事件例如事件及繫結事件的幾種方式

事件:什麼叫做事件呢,就是我們在頁面中的一些滑鼠和鍵盤操作,比如onclick就是點選事件,然後我們將介紹幾種繫結事件的方式。 1.在標籤中繫結 <div onclick="fuc()"></div> <script> fun

設定TextView部分文字下劃線並響應事件(SpannableString)

實現效果 textview中改變《服務條款》的顏色、增加下劃線。 實現關鍵點: SpannableString的使用 SpannableString spanText=new SpannableString(getString(R.string.d

RecyclerView使用,RecyclerView使用,增加一個item,刪除一個item,更新資料,item事件

build.gradle compile 'com.android.support:appcompat-v7:24.2.0' compile 'com.android.support:recyclerview-v7:24.2.0' main_a

RecyclerView通用adapter以及item事件的實現

  今天實現內容如下: 1.實現recyclerview通用的adapter CommonAdapter 2.實現recyclerview item的點選事件 先上效果圖 viewpager+f

Android中Kotlin的學習事件跳轉for迴圈RecyclerView回撥

剛剛學習Kotlin,有什麼不對的地方請見諒。 首先屬性的宣告中有兩個很重要的關鍵字: var  和  val。 例如: var a = "hello" val b = "hello"區別是什麼呢? var可多次分配; val只能一次初始化。 點選事件: xml中View定

RecyclerView展示固定資料上拉載入更多下拉重新整理事件長按事件刪除條目重新整理條目新增條目條目載入

1、依賴:    implementation 'com.android.support:recyclerview-v7:27.0.2' 2、activity_main、 <?xml version="1.0" encoding="utf-8"?> <Li

設定RecyclerView的位置回到頂部

1  隱藏和顯示回到頂部按鈕 假設有個RecylerView rvHome;有個adapter  rvHome.setAdapter(new HomeFragmentAdapter(mContext

android 自定義ListView實現下拉重新整理分頁載入事件——自定義控制元件學習

package com.example.administrator.customerpulldownrefreshandpageload; import android.content.Context; import android.os.Handler; import android.os.Message

淺談tomcat優化內存,並發,緩存,安全,網絡,系統

mps config 兩種 問題 adding back get ces hit 一.Tomcat內存優化Tomcat內存優化主要是對 tomcat 啟動參數優化,我們可以在 tomcat 的啟動腳本 catalina.sh 中設置 java_OPTS 參數JAVA_OPT

RecyclerView的Item事件,增加刪除Item瀑布流動畫效果,長按拖動Item,RecyclerView複雜佈局實現新聞頻道選擇器

RecyclerView的Item點選事件的實現,增加和刪除Item使用瀑布流動畫效果,長按拖動Item,RecyclerView複雜佈局的實現使用、RecyclerView去實現今日頭條新聞頻道選擇器。 使用ItemTouchHelper實現Item的拖動交換,由於Recy

RecyclerView新增優雅的事件長按事件

本篇參考:Hugo的文章-Getting your clicks on RecyclerView 效果如下 一、完整的點選、長按事件支援類 先要準備一份resources res -> values ->

RecyclerView新增事件長按事件

本篇展示手機內已安裝的軟體資訊,並新增事件,效果如下 一、準備工作 儲存App資訊的bean public class AppInfo { public String name; // 應用名

3jq動畫執行過程中不讓重複即執行完動畫後

$(".btnoff").click(function(){ var offbtnStatus = false;//初始化狀態,給狀態false,不讓連續點選 if(offbtnStatus){//如果狀態為真,說明函式未執行完,return跳出 return;

[Android]RecyclerView基本使用+adapter回撥介面實現事件

一、概述 RrcyclerView是ListView的加強版,不僅可以輕鬆實現和ListView同樣的效果,還優化了ListView中存在的各種不同之處。 Android官方推薦我們使用RecyclerView。 二、基本用法 1.首先需要在專案的build.gradle中新增相

RecyclerView item內部事件item事件衝突

1.recyclerview item內部控制元件沒有點選事件 在recyclerview item內部控制元件不存在點選事件的情況下。item設定點選事件可通過新增觸控事件 recyclerv

Android中RecyclerView的item中控制元件的事件新增刪除一行上移下移一行的程式碼實現

Demo展示圖片 佈局程式碼 // (layout)activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/an

Android中WebView載入Html中的圖片新增事件

    基本的思路: (1)WebView來載入HTML。 (2)向HTML中注入JavaScript,利用JavaScript來呼叫Android中的方法(執行一些跳轉的操作等等)。  首先你必須有一個HTML或者是一個地址,或者是存到本地的一個檔案。我這裡使用的是存到本

iCheck表單美化外掛使用方法詳解含引數事件

iCheck 特色: 1、在不同瀏覽器(包括ie6+)和裝置上都有相同的表現 — 包括 桌面和移動裝置 2、支援觸控裝置 — iOS、Android、BlackBerry、Windows Phone等系統 4、方便定製 — 用HTML 和 CSS 即可為其設定樣式 (多套面板) 5、體積小巧 — gzi

Android-RecyclerView-Item事件設定

轉載請註明出處:http://write.blog.csdn.net/postedit/40423361 在上一篇部落格Android-RecylerView初識中提到,RecyclerView不再負責Item檢視的佈局及顯示,所以RecyclerView也沒有為Item