嵌套RecyclerView左右滑動替代自定義view

来源:http://www.cnblogs.com/LiuZhen/archive/2017/06/22/7065874.html
-Advertisement-
Play Games

以前的左右滑動效果採用自定義scrollview或者linearlayout來實現,recyclerview可以很好的做這個功能,一般的需求就是要麼一個獨立的左右滑動效果,要麼在一個列表裡的中間部分一個左右滑動效果 而列表裡面也容易,只是需要解決一點小問題,個人認為值得一提的就是高度問題,一般的人採 ...


以前的左右滑動效果採用自定義scrollview或者linearlayout來實現,recyclerview可以很好的做這個功能,一般的需求就是要麼一個獨立的左右滑動效果,要麼在一個列表裡的中間部分一個左右滑動效果

而列表裡面也容易,只是需要解決一點小問題,個人認為值得一提的就是高度問題,一般的人採用固定死的高度,可是在列表裡面展示和機型的不同,固定死的話很難保證美觀,動態的高度才能解決問題的所在

首先在一個列表控制項佈局上添加一個recyclerview控制項

<android.support.v7.widget.RecyclerView
        android:id="@+id/plan_recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

 

然後是adapter適配器佈局

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

    <ImageView android:id="@+id/img_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:src="@drawable/bbs_plan_mofa"/>
    <TextView android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="@dimen/dimen_8dp"
        android:textSize="15sp"
        android:textColor="@color/color_323232"/>

</LinearLayout>

接下來寫adapter

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.xulu.loanmanager.R;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * Created by LiuZhen on 2017/6/22.
 */

public class BBSPlanAdapter extends RecyclerView.Adapter<BBSPlanAdapter.MyViewHolder> {

    private List<String> list;
    private LayoutInflater mInflater;
    private Context context=null;
    private int height;
    private boolean isMeasure = false;
    private CallBack callBack;

    public BBSPlanAdapter(Context context, List<String> list, CallBack callBack) {
        this.context=context;
        this.list = list;
        mInflater = LayoutInflater.from(context);
        this.callBack = callBack;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.item_bbsdetail_plan, parent, false);
        if (!isMeasure) {
            view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
            height = view.getMeasuredHeight();
            callBack.getHeight(height);
        }
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    public int getHeight(){
        return height;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                callBack.ItemClick(position);
            }
        });
    }

    @Override
    public int getItemCount() {
        return 6;
    }

    static class MyViewHolder extends RecyclerView.ViewHolder{

        @BindView(R.id.tv_content)
        TextView tv_content;

        MyViewHolder(View view){
            super(view);
            ButterKnife.bind(this,view);
        }

    }

    public interface CallBack{
        void getHeight(int height);
        void ItemClick(int position);
    }

}

重點是measure方法,得到測量的高度

接下來就可以直接使用了

private void initScrollList(){
        final RecyclerView planRecycler = (RecyclerView) headView.findViewById(R.id.plan_recycler);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(BBSDetailActivity.this);
        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        planRecycler.setLayoutManager(linearLayoutManager);
        List<String> list = new ArrayList<>();
        BBSPlanAdapter adapter = new BBSPlanAdapter(BBSDetailActivity.this, list, new BBSPlanAdapter.CallBack() {
            @Override
            public void getHeight(int height) {
                ViewGroup.LayoutParams params = planRecycler.getLayoutParams();
                params.height = height;
                planRecycler.setLayoutParams(params);
            }

            @Override
            public void ItemClick(int position) {
                Toast.makeText(BBSDetailActivity.this,""+position,Toast.LENGTH_SHORT).show();
            }
        });
        planRecycler.setAdapter(adapter);
    }

很簡單,完全替代自定義view,效果如下,如果沒有測量這一步可能會出現高度不適合,要麼是看不到textview的文字,因為太低了,要麼就是太高了,不美觀

 


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

-Advertisement-
Play Games
更多相關文章
  • 最近看到vue-router的HTML5 History 模式路由的實現,然後順便又去研究了一下HTML5 的 History,以下是自己的一些理解,順便用jquery寫 一個實現類似vue-router裡面HTML5 History 模式路由器,以達到練練手,熟悉熟悉的目的。 一、history. ...
  • 這種純CSS3美化單選按鈕radio的方法適用於以下情況: 1、可相容IE9以上,需要相容IE8的要寫IE的hack把樣式去掉 2、只支持單選按鈕radio,因為單選按鈕選中樣式的圓圈可以用CSS做出來,但是覆選按鈕checkbox的選中效果對勾就需要圖片或者圖標字體庫 3、不需要JS支持切換效果 ...
  • 簡介 常用地址 安裝node,查看版本命令: 因為npm伺服器在國外,如果沒有翻牆且npm特別慢的話,可以考慮安裝淘寶鏡像文件,安裝cnpm命令 npm 安裝參數說明: npm 安裝、卸載、更新、幫助、列出已安裝插件命令: npm自動生成配置文件 安裝好Npm後,全局安裝gulp 然後在你項目里,新 ...
  • Dragger2是Android應用開發中一個非常優秀的依賴註入框架。本文主要通過結合Google給出的MVP開發案例todo-mvp-dagger(GitHub連接地址:https://github.com/googlesamples/android-architecture/tree/todo- ...
  • 本文轉自: "在 Mac OS 上編譯 OBS | www.samirchen.com" 安裝環境 第一步,做準備工作,安裝編譯 OBS 所需要的環境,流程如下: 下載和編譯 OBS 從 "https://github.com/jp9000/obs studio" 下載 OBS 代碼: 編譯 OBS ...
  • 關於圖片壓縮:imageview的大小與image的大小不一致,識別的時候,是按照image的大小進行計算,通過重繪,使imageview與image保持一致。 關於坐標Y軸翻轉:屏幕的坐標原點即(0,0)點在左上角,識別圖片的坐標原點在左下角。 運行結果 控制台輸出結果 ...
  • levmar是一個強大的和高效率的C/C++庫,採用Levenberg - 馬奎德(LM)優化演算法, 主要是為瞭解決非線性最小二乘問題。官網是:http://users.ics.forth.gr/~lourakis/levmar/ 在PC引用,網上有挺多的資料可以查詢到,但我想應用到Android上 ...
  • 文章轉自: "直播協議的選擇:RTMP vs. HLS" 前言 隨著直播業務的興起,越來越多的直播平臺開始涌現,這火熱的程度好像一個應用不帶上直播業務出來都不好意思跟人打招呼。想要做一個直播業務,主要包括三個部分:採集推流端、流媒體服務端、播放端。這裡不多說,就主要結合 iOS 平臺,從觀看端出發, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...