輪播圖記錄篇

来源:http://www.cnblogs.com/LiuZhen/archive/2017/11/17/7851140.html
-Advertisement-
Play Games

RecyclerView做的一個輪播效果,適配器有視圖緩存,避免了一些記憶體問題 首先是藉助 PagerSnapHelper 讓RecyclerView每次只滑動一個,然後添加一個指示器,這裡指示器是動態生成的,自己做了個簡單的view 很簡單的一個效果,直接上代碼 public class Imag ...


 

RecyclerView做的一個輪播效果,適配器有視圖緩存,避免了一些記憶體問題

首先是藉助 PagerSnapHelper 讓RecyclerView每次只滑動一個,然後添加一個指示器,這裡指示器是動態生成的,自己做了個簡單的view

很簡單的一個效果,直接上代碼

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/bg_indicator_point_selected"
    android:gravity="center"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" />

    <com.hanmaker.bryan.hc.widget.LinIndicate
        android:id="@+id/lin_indicate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center_horizontal"
        android:gravity="center"
        android:orientation="horizontal"/>

</FrameLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/d20.0">

    <com.hanmaker.bryan.hc.widget.MyPhotoView android:id="@+id/img_icon"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitCenter"
        android:layout_gravity="center" />

</FrameLayout>
public class ImageListAdapter extends BaseQuickAdapter<String,BaseViewHolder> {

    private CallBack callBack;

    public ImageListAdapter(int layoutResId,CallBack callBack) {
        super(layoutResId);
        this.callBack = callBack;
    }

    @Override
    protected void convert(BaseViewHolder helper, String item) {

        if (item != null && !item.isEmpty()){
            MyPhotoView img =helper.getView(R.id.img_icon);
            GlideApp.with(AndroidApplication.getInstance().getApplicationContext())
                    .load(item)
                    .skipMemoryCache(true)
                    .fitCenter()
                    .into(img);
            img.setOnPhotoTapListener((view, x, y) -> callBack.click());
        }

    }

    public interface CallBack{
        void click();
    }


}
View Code
@Override
    protected void initData() {
        Bundle bundle = getArguments();
        ArrayList<String> list = bundle.getStringArrayList("Photo");
        int position = bundle.getInt("Photo_p", 0);
        adapter = new ImageListAdapter(R.layout.item_imagelist, new ImageListAdapter.CallBack() {
            @Override
            public void click() {
                if (getActivity() != null) {
                    getActivity().finish();
                }
            }
        });
        adapter.addData(list);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(linearLayoutManager);
        linearLayoutManager.scrollToPositionWithOffset(position, 0);
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setAdapter(adapter);
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_IDLE && lin_indicate != null) {//不滑動的時候,避免多次觸發
                    int lastItemPosition = linearLayoutManager.findLastCompletelyVisibleItemPosition();
                    lin_indicate.setIndicatePosition(lastItemPosition);
                }
            }
        });
        new PagerSnapHelper().attachToRecyclerView(recyclerView);
        int count = list.size();
        lin_indicate.load(count,position);
        adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                if (getActivity() != null) {
                    getActivity().finish();
                }
            }
        });
    }
View Code
public class LinIndicate extends LinearLayout {


    public LinIndicate(Context context) {
        super(context);
    }

    public LinIndicate(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public LinIndicate(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void load(int count){
        removeAllViews();
        for (int i = 0; i < count; i++) {
            ImageView imageView = new ImageView(getContext());
            ViewGroup.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            imageView.setLayoutParams(params);
            imageView.setPadding(10,10,10,20);
            addView(imageView);
        }
    }

    /**
     * @param count 指示器數量
     * @param position 預設顯示下標
     */
    public void load(int count,int position){
        removeAllViews();
        for (int i = 0; i < count; i++) {
            ImageView imageView = new ImageView(getContext());
            ViewGroup.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            imageView.setLayoutParams(params);
            imageView.setPadding(10,10,10,20);
            addView(imageView);
        }
        setIndicatePosition(position);
    }

    public void setIndicatePosition(int position){
        int count = getChildCount();
        if (position > count)
            return;
        for (int i = 0; i < count; i++) {
            ImageView imageView = (ImageView) getChildAt(i);
            if (position == i){
                imageView.setImageResource(R.mipmap.ic_page_indicator_focused);
            }else{
                imageView.setImageResource(R.mipmap.ic_page_indicator);
            }
        }
    }

}
View Code

雖然簡單,但是也記錄一下,說不定哪天就能幫上忙呢,有的時候遇到很多問題解決過但是想不起來,可是當你看到相關聯的一些代碼,或許記憶片段就來了

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 整理JavaScript方面的一些技巧,比較實用的函數,常見功能實現方法,僅作參考 變數轉換 但是轉換日期(new Date(myVar))和正則表達式(new RegExp(myVar))必須使用構造函數,創建正則表達式的時候要使用/pattern/flags這樣的簡化形式。 取整同時轉換成數值型 ...
  • 寫在前面 列表一直是展示數據的一個重要方式,在手機端的列表展示又和PC端展示不同,畢竟手機端主要靠滑。之前手機端之前一直使用的 ,但是 本身其實有很多相容性 ,想改動一下需求也很不容易,可以看我之前寫的這一文章 "IScroll那些事——內容不足時下拉刷新" (這裡並不是說 不好,裡面對手機、瀏覽器 ...
  • 代碼如下: 原因:跨頁面操作涉及域的概念(origin),錯誤的意思是:未捕獲的安全錯誤:阻止了一個域為null的frame頁面訪問另一個域為null的頁面。代碼運行時在本地直接用瀏覽器打開的,地址欄是file:///的頁面,只需改為localhost訪問就行。 ...
  • ...
  • 要成為高產、高效的Web開發者,這需要我們做很多工作,來提高我們的工作方式,以及改善我們的勞動成果。 下麵是10個提高效率的步驟,雖然不能保證解決你在開發中的所有問題,但至少是非常實用的,可以簡化你的Web開發流程,使開發的每一個環節快速、流暢。還可以幫助你節省大量的時間,以便開發更多、更好的項目。 ...
  • 本文以一個小例子簡單介紹微信小程式開發的相關內容,希望共同學習進步。 ...
  • 今天寫登錄註冊頁面,點擊登錄頁面的“註冊”按鈕後軟體突然崩潰,直接閃退,因為是新手,只能去網上搜。雖然網上解決方法眾多,但也沒找到可行的。想起來可以看Logcat,馬上重新運行應用,查看崩潰時的日誌,發現日誌比較多,還都不認識,只好又複製日誌上網搜索,無果。突發奇想,把註冊頁面有關Toolbar的內 ...
  • 1.ViewController .m 頭部代理 代理方法 2.KKViewController(目標ViewController) 新建一個KKViewController .h .m 頭部代理 手勢代理方法 效果圖 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...