1. 程式人生 > >Android RecyclerView多個Item佈局的實現(可實現頭部底部)

Android RecyclerView多個Item佈局的實現(可實現頭部底部)

廢話不多說,小猿,上程式碼

package git.dzc.library;

import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;


/**
 * Created by dzc on 15/10/9.
 */
public abstract class HeadFootAdapter<HeadViewHolder extends RecyclerView.ViewHolder,FootViewHolder extends RecyclerView.ViewHolder,ItemViewHolder
extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
//item的type 代表頭部 中間 底部三個型別 static int TYPE_HEAD = 0; static int TYPE_ITEM = 1; static int TYPE_FOOT = 2; /** *頭部ViewHolder **/ public abstract HeadViewHolder onCreateHeaderViewHolder(ViewGroup parent, int position); public abstract
ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int position); public abstract FootViewHolder onCreateFooterViewHolder(ViewGroup parent, int position); public abstract void onBindHeaderViewHolder(HeadViewHolder holder, int position); public abstract void onBindItemViewHolder(ItemViewHolder holder, int position); public abstract
void onBindFooterViewHolder(FootViewHolder holder, int position); /** *根據viewType來建立不同的ViewHolder **/ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { switch (viewType){ case 0: return onCreateHeaderViewHolder(viewGroup,viewType); case 1: return onCreateItemViewHolder(viewGroup, viewType); default: return onCreateFooterViewHolder(viewGroup,viewType); } } /** *根據ViewType繫結資料 這裡重新計算了position,使每個部分的position都從0開始 **/ @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { int headCount = getHeadViewCount(); int itemViewCount = getItemViewCount(); int itemType = getItemViewType(i); switch (itemType){ case 0: onBindHeaderViewHolder((HeadViewHolder) viewHolder,i); break; case 1: onBindItemViewHolder((ItemViewHolder) viewHolder,i-headCount); break; case 2: onBindFooterViewHolder((FootViewHolder) viewHolder,i-itemViewCount-headCount); break; } } /** *adapter會呼叫這個方法來獲取item的總數 *因為在這裡 總數為上中下三部分數量加起來 不需要重寫 *所以標誌為final *返回所有View的數量 **/ @Override public final int getItemCount(){ return getHeadViewCount() + getFootViewCount() + getItemViewCount(); } /** *返回頭部View的數量 **/ public abstract int getHeadViewCount(); /** *返回底部View的數量 **/ public abstract int getFootViewCount(); /** *返回中間View的數量 **/ public abstract int getItemViewCount(); /** *這句話是關鍵 根據position來判斷item的型別 *adapter會將此方法的返回值傳入onCreateViewHolder **/ @Override public int getItemViewType(int position) { // return super.getItemViewType(position); int headCount = getHeadViewCount(); int itemCount = getItemViewCount(); if(position<headCount){ return TYPE_HEAD; } if(position>headCount+itemCount-1){ return TYPE_FOOT; } return TYPE_ITEM; } }

這裡我把Adapter重新封裝了一遍,實現了上中下三個部分的ViewHolder的建立和資料繫結,基本語法和原來普通的RecyclerView的Adapter一樣,下面是demo程式碼,程式碼很簡單,就不解釋了,item裡面就放了一個TextView

package git.dzc.head_foot_recycleview;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import git.dzc.library.HeadFootAdapter;

public class MainActivity extends AppCompatActivity {
    private RecyclerView rv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rv = (RecyclerView) findViewById(R.id.rv);
        rv.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        rv.setAdapter(new HeadFootAdapter<HeadViewHolder,FootViewHolder,ItemViewHolder>() {
            @Override
            public HeadViewHolder onCreateHeaderViewHolder(ViewGroup parent, int position) {
                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item2,parent,false);
                return new HeadViewHolder(view);
            }

            @Override
            public ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int position) {
                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item,parent,false);
                return new ItemViewHolder(view);
            }

            @Override
            public FootViewHolder onCreateFooterViewHolder(ViewGroup parent, int position) {
                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item2,parent,false);
                return new FootViewHolder(view);
            }

            @Override
            public void onBindHeaderViewHolder(HeadViewHolder holder, int position) {
                holder.tv.setTextColor(Color.GREEN);
                holder.tv.setTextSize(30);
                holder.tv.setText("head "+position);
            }

            @Override
            public void onBindItemViewHolder(ItemViewHolder holder, int position) {
                holder.tv.setText("item  "+position);
            }

            @Override
            public void onBindFooterViewHolder(FootViewHolder holder, int position) {
                holder.tv.setTextColor(Color.BLUE);
                holder.tv.setTextSize(34);
                holder.tv.setText("foot "+position);
            }

            @Override
            public int getItemViewCount() {
                return 10;
            }

            @Override
            public int getHeadViewCount() {
                return 7;
            }

            @Override
            public int getFootViewCount() {
                return 8;
            }
        });
    }


    class ItemViewHolder extends RecyclerView.ViewHolder{
        public TextView tv;
        public ItemViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv);
        }
    }


    class HeadViewHolder extends RecyclerView.ViewHolder{
        public TextView tv;
        public HeadViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv);
        }
    }

    class FootViewHolder extends RecyclerView.ViewHolder{
        public TextView tv;
        public FootViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv);
        }
    }
}

這是效果圖
這裡寫圖片描述

相關推薦

Android RecyclerViewItem佈局實現實現頭部底部

廢話不多說,小猿,上程式碼 package git.dzc.library; import android.support.v7.widget.RecyclerView; import android.view.ViewGroup; /** * Cre

Android recyclerview 佈局 item資料錯亂

這個問題困擾了兩三天,recyclerview在採用多種佈局的情況下,在onBindViewHolder繫結的時候會,會將不會顯示的佈局用View.GONE隱藏起來,看似沒有問題!但是上下滑動的時候會發生item顯示錯亂! 原本的item資料顯示,在滑動幾次後,顯示條數只剩下幾條 走了

關於一個ListView使用item佈局在優化時出現顯示錯亂的解決方案

一個很麻煩的問題,引用兩個或者多個佈局由於使用了ViewHolder和contenView做優化,頁面在複用時出現要顯示的內容錯亂,經過上網查詢和查谷歌官方的原始碼終於解決了這個問題 首先看下谷歌原始碼是怎麼寫的 這個是Adapter.class檔案中的

android -------- RecyclerViewItem水平,垂直滾動列表的實現

RecyclerView的可滾動的列表實現,檢視相鄰的檢視在螢幕上部分或完全可見(水平3個item,第一個和第三個顯示一部分,第二

RecyclerView 選擇item實現

模仿網易新聞客戶端閱讀偏好的頻道選擇,先看實現的頁面: 直接上程式碼: import android.content.res.Resources; import android.content.res.TypedArray; import andro

Android RecyclerView佈局實現

主要操作實在Adapter中的。區別於正常RecyclerView的Adapter。首先是定義幾個全域性的變數來標識有幾種佈局。public static final int ONE_ITEM = 1; public s

IIS https綁定主機頭方法實現禁止直接通過IP訪問,好像還可以實現IIS中綁定https<是使用單域名證書,非域名證書>

多個 nbsp app for iis 直接 fig protoc eight 步驟: 打開:%systemroot%\SYSTEM32\inetsrv\config\ 打開:applicationHost.config 查找:<binding protocol="

Android ListView不同的item佈局實現

類似與這個 聊天效果 和 進入直播間 注意 在使用不同佈局的時候,在介面卡中 getItemViewType和getViewTypeCount不能少,一般的同一種item的列表是不用這兩個函式的過載的,但是如果需要不同種類的item,就必須過載這兩個

Android RecyclerView 佈局與混排

多佈局   關於RecyclerView的基本用法參考下面三篇部落格:  Android RecyclerView之代替ListView與GridView  Android RecyclerView之新增Item分割線  Android RecyclerView 的瀑布流式

Java實現檔案上傳驗證檔案大小、檔案型別

檔案上傳是每個java開發者必須掌握的。檔案上傳有很多種實現方式,但其實也大同小異。筆人在這裡為大家介紹一種我習慣用的,上傳檔案的方式。大家先看程式碼,最後我會分享我的原始碼給大家。 1、首先要準備一下需要用到的jar包。 commons-fileuplo

ListView中有ItemItem中是edittext或則其他需要焦點的控制元件丟失焦點的問題

ListView中有多個Item,Item中是edittext或則其他需要焦點的控制元件丟失焦點的問題.         發生這個的原因是因為,當點選item中的edittext的時候,軟鍵盤彈出來的時候,如果軟鍵盤會覆蓋到Item佈局,那麼就會造成ListView將會發生

Hadoop 裡MapReduce裡 實現job任務 包含迭代式、依賴式、鏈式

一、迭代式,所謂的迭代式,下一個執行的Job任務以上一個Job的輸出作為輸入,最終得到想要的結果。 這裡我只寫關鍵的程式碼了 Job job = new Job(new Configuration(),“test”); JobConf jobConf=(JobCon

實現單個頁面,百度分享動態修改百度分享連結

在我編寫文章列表頁程式碼的時候,想實現每一條文章都有一個分享按鈕,此處用到百度分享。百度分享官網:http://share.baidu.com/code/advance。 官網給出的完整程式碼只適合分

利用Metaweblog技術的API接口同步到博客網站詳細

other pla 呵呵 博客 ice nload -1 china 簡單 很早就有這個想法:自己有時候會用到多個博客,有些博客在一個網站上寫完之後,要同步到其他博客網站,自己只能復制粘貼,感覺特別沒意思,復制粘貼的麻木了。一直在想有哪些技術能實現一次寫博,多站同步。最近網

VIewPager顯示Item

viewpager http wpa weixin mage blog com log alt 一直以來想搞明白這個不完全的VIewPager是怎麽做到的,有幸看到這片篇文章 VIewPager顯示多個Item

recyclerview23+出現item只顯示第一個item的問題

inflate 參數設置 解決方案 ren view 使用 方案 ont match 1.改成21+可以,如果不行,就使用第2或第3個解決方案 2.對每個item的inflate,傳入兩個參數,第二個參數設置為null,而不是使用3個參數(第二個parent,第三個fal

Android RecyclerView 設置item間隔的方法

== ews lis lar override top spec clas margin RecyclerView大家常用,但是如何給加載出來的item增加間隔很多人都不知道,下面是方法,直接上代碼了: LinearLayoutManager layoutManage

Windows上安裝MySQL實例

windows 小寫 install current -o iter 不同的 包安裝 class 在學習和開發過程中有時候會用到多個MySQL數據庫,比如Master-S

兩組字符串中的最長公共子串包含長度相同的最長公共子串

String#include <stdio.h>#include <string.h>main(){int i,j,k,n,h,m=0,count=0,count1=0,count2=0,count3=0;char str1[100], str2[100];int str3[100];

log4j配置輸出到日誌文件

兩種模式 簡單 mylog 效果 evel ast mar 輸出 rop 參考資料:http://logging.apache.org/log4j/1.2/manual.html 通常我們項目裏,有一些重要的日誌想單獨的輸出到指定的文件,而不是全總輸出到系統的日誌文件中。那