1. 程式人生 > >RecyclerView用法--展示多種型別Item資料

RecyclerView用法--展示多種型別Item資料

如題,本文主要介紹RecyclerView的基本使用方法,像ListView一樣展示多種型別的Item資料。

首先介紹一下實體類:ItemPO,用來表示每個Item代表的資料型別:

package com.example.cxc.fullscreendemo.decoration.po;

import java.io.Serializable;

public class ItemPO implements Serializable {
    private static final long serialVersionUID = 7879752396036182745L;

    private String name;
    private int age;

    public ItemPO(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

其次,介紹一下測試的Activity頁面,其佈局activity_recycler_view_test.xml及RecyclerViewTestActivity如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>
package com.example.cxc.fullscreendemo.decoration;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import com.example.cxc.fullscreendemo.R;
import com.example.cxc.fullscreendemo.decoration.adapter.RecyclerViewTestAdapter;
import com.example.cxc.fullscreendemo.decoration.po.ItemPO;

import java.util.ArrayList;
import java.util.List;

public class RecyclerViewTestActivity extends AppCompatActivity {
    private static final String TAG = "RecyclerViewTestActivity";

    private RecyclerView mRecyclerView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //設定佈局
        setContentView(R.layout.activity_recycler_view_test);

        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

        //設定LayoutManager
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(layoutManager);

        //設定Adapter
        RecyclerViewTestAdapter adapter = new RecyclerViewTestAdapter();
        mRecyclerView.setAdapter(adapter);

        //設定資料
        List<ItemPO> items = fakeItems();
        adapter.notifyDataSetChanged(items);
    }


    private static final int ITEM_COUNT = 100;

    private static List<ItemPO> fakeItems() {
        List<ItemPO> items = new ArrayList<>(ITEM_COUNT);

        for (int i = 0; i < ITEM_COUNT; i++) {
            ItemPO tItem = new ItemPO("Name_" + i, i);
            items.add(tItem);
        }

        return items;
    }
}

佈局及Activity中的邏輯都很簡單明瞭,構造了100個使用者資訊Item用來展示。為了UI介面的豐富性,年齡為偶數的Item,名字和年齡分兩行展示,年齡為奇數的Item名字和年齡在一行展示。如何構造ItemView並展示資料,需要使用Adapter來完成,即RecyclerViewTestAdapter。

package com.example.cxc.fullscreendemo.decoration.adapter;

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

import com.example.cxc.fullscreendemo.R;
import com.example.cxc.fullscreendemo.decoration.po.ItemPO;

import java.util.List;

public class RecyclerViewTestAdapter extends RecyclerView.Adapter<TestBaseViewHolder> {
    private static final int TYPE_1 = 1;//橫向排列名字和年齡
    private static final int TYPE_2 = 2;//豎向排列名字和年齡

    private List<ItemPO> items;

    @Override
    public int getItemViewType(int position) {
        ItemPO item = getItem(position);
        //age是奇數時使用TYPE_1,偶數時使用TYPE_2;
        return item != null && item.getAge() % 2 == 0 ? TYPE_2 : TYPE_1;
    }

    @Override
    public TestBaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        TestBaseViewHolder holder = null;
        switch (viewType) {
            case TYPE_1:
                View itemView1 = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_type_1_layout, parent, false);
                holder = new TestViewHolder(itemView1);
                break;
            case TYPE_2:
                View itemView2 = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_type_2_layout, parent, false);
                holder = new TestViewHolder(itemView2);
                break;
        }
        return holder;
    }

    @Override
    public void onBindViewHolder(TestBaseViewHolder holder, int position) {
        ItemPO item = getItem(position);
        holder.fillData(item);
    }

    @Override
    public int getItemCount() {
        return items == null ? 0 : items.size();
    }

    public ItemPO getItem(int position) {
        return position >= 0 && position < getItemCount() ? items.get(position) : null;
    }

    public void notifyDataSetChanged(List<ItemPO> items) {
        this.items = items;
        notifyDataSetChanged();
    }
}

其中:

public int getItemViewType(int position) :返回position位置的Item的ViewType,以便ItemView回收利用;

public int getItemCount():DataSet中資料Item的個數;

public TestBaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType):根據viewType返回相應的ViewHolder,也就是建立不同UI的ItemView;

public void onBindViewHolder(TestBaseViewHolder holder, int position):將DataSet中position位置的資料填充至該ViewHolder中展示;

執行結果如下圖如示,其中紅色/藍色各代表一個使用者資訊,紅色:名字和年齡各佔一行展示;藍色:名字和年齡共佔一行展示;

可以根據getItemViewType()返回值在onCreateViewHolder()中建立各種各樣的Ui樣式,然後在onBindViewHolder()中將資料填充展示。

完整示例請參考:

相關推薦

RecyclerView用法--展示多種型別Item資料

如題,本文主要介紹RecyclerView的基本使用方法,像ListView一樣展示多種型別的Item資料。 首先介紹一下實體類:ItemPO,用來表示每個Item代表的資料型別: package com.example.cxc.fullscreendemo.decora

多種型別itemRecyclerview能夠上拉和下拉重新整理--XRefreshView

什麼是XRefreshView XRefreshView是一款支援任何view上拉載入和下拉重新整理的庫,之所以說是任何view,是因為他不僅在內部適配了Recyclerview,abslistview,scrollview,webview等view,還提供了

HTTP詳解(五):HTTP POST方法傳輸多種型別資料

上圖中主要就是上傳excel時的請求頭,我們重點看一下Content-Type,可以看出Content-Type=multipart/form-data; boundary=---------------------------3618134789,其中將Content_Type設定成multipart/fo

Android recyclerview 多個佈局 item資料錯亂

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

RecyclerView展示多種佈局

按照慣例 先看看效果圖 簡介 最上面是一個輪播圖,然後下面是一個橫向滑動的頻道,然後下面就是一個GridView,再下面就是正常的佈局顯示了 當然這還不算是很複雜的佈局,我這邊只是講講原理和實現步驟,更多複雜佈局可以根據這個去擴充套件 原理 給不同

java學習-list集合有泛型情況新增多種型別資料

//來自一道面試題的分析,大概的意思是,如果讓你在集合中增加不同型別的資料,你會怎麼做?package cn.cnsy123.ypf.thread.test; import java.lang.reflect.InvocationTargetException; impo

springboot配置多種型別多資料來源(mysql+postgresql+presto(資料倉庫))yml方式整合分頁

宣告:此處示例為mysql和postgresql資料庫和presto 三種類型資料庫源mysql與postgresql都屬於資料庫所以這裡簡寫只配置postgresql庫presto是資料倉庫在配置資料來源測試時會遇到很多坑,等下詳細描述首先宣告:我專案的springboot

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

if語句和case語句用法展示

法律 括號 如果 if...else 是你 acc back please status                               if語句和case語句用法展示                                               

11.1 js中級,資料型別資料儲存方式、作用域記憶體空間的區別以及例識別。

一. 基本資料型別和引用資料型別的區別。     1.基本資料型別:基本資料型別就是簡單的操作值。     2.引用資料型別:就是把引用的地址賦給變數。   堆記憶體:     就是存放程式碼塊的,存放形式有兩種       1)物件以鍵值對的形式存放       2)引用資料型別的賦值,是把引用

讀取blob型別圖片資料 儲存到本地

如何將blob型別資料的圖片資料從資料庫中讀取出來,並儲存到本地呢? 程式碼如下: 定義一個實體類: public class IdeaImgOutVo { private byte[] photo;//圖片 private String plNO;//手冊編碼

從db2資料庫讀取blob型別圖片資料並在前端頁面顯示

最近要寫一個需求,從db2中讀取圖片資料,blob型別,然後在前端頁面顯示,採用的是前後端分離的開發模式,使用下面這種方式,可以忽略前端,前端不需要動程式碼,就可直接顯示。。 直接上程式碼: sql:只給大家擷取關鍵部分,select   xmlgroup(pe.Pict

使用反射技術往集合中新增不同型別資料

public class TestException { public static void main(String[] args) throws Exception { List<String> list= new ArrayList<String>

資料(十八):Hive元資料配置、常見屬性配置、資料型別資料轉換

一、Hive元資料配置到MySQL當中         為什麼要把Hive的元資料配置到MySql中?我們可以使用多個客戶端連線linux系統並且都嘗試啟動Hive,可以發現在啟動第二個Hive客戶端的時候發生報錯了。   

日期型別資料在Oracle資料庫中的儲存和查詢

使用Oracle資料庫,mybatis的對映檔案中日期型別的資料,如果定義為<result column =“UPDATED_DATE" jdbcType =“DATE” property =“updatedDate”/>,即使在後臺你為日期賦予年月日時分秒,但儲存到資料庫中將只

使用js處理後臺返回的Date型別資料

從後臺返回的日期型別的資料,如果直接在前端進行顯示的話,顯示的就是一個從 1970-01-01 00:00:00到現在所經過的毫秒數,而在大多數業務中都不可能顯示這個毫秒數,大多數都是顯示一個正常的日期格式,所以在這裡,我們使用js對於從後臺返回的Date型別的資料進行處理. 方法一、 co

練習使用qsort函式排序各種型別資料

練習使用qsort函式排序各種型別的資料 程式程式碼如下: #include <stdio.h> #include<stdlib.h> #include<string.h> #include<assert.h>

資料型別以及資料型別的轉換

一、基本資料型別: byte:Java中最小的資料型別,在記憶體中佔8位(bit),即1個位元組,取值範圍-128~127,預設值0 short:短整型,在記憶體中佔16位,即2個位元組,取值範圍-32768~32767,預設值0 int:整型,用於儲存整數,在內在中佔32位,即4個位元

後端-框架-Spring-IoC-多種型別注入

後端-框架-Spring-IoC-多種型別注入 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="h

java基礎複習第二天——基本資料型別,引用資料型別資料型別轉換,運算子

目錄 1.基本資料型別(4類八種) 2.引用資料型別 3.基本型別和引用型別的區別 4.資料型別轉換 5.運算子 ----------------------------------------------------------------------我是分割線--