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 RecyclerView多個Item佈局的實現(可實現頭部底部)
廢話不多說,小猿,上程式碼 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 -------- RecyclerView的可(多個Item水平,垂直)滾動列表的實現
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中有多個Item(Item中是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 通常我們項目裏,有一些重要的日誌想單獨的輸出到指定的文件,而不是全總輸出到系統的日誌文件中。那