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.RecyclerViewandroid: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;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);//設置布局setContentView(R.layout.activity_recycler_view_test);mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);//設置LayoutManagerLinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.VERTICAL);mRecyclerView.setLayoutManager(layoutManager);//設置AdapterRecyclerViewTestAdapter 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;@Overridepublic int getItemViewType(int position) {ItemPO item = getItem(position);//age是奇數時使用TYPE_1,偶數時使用TYPE_2;return item != null && item.getAge() % 2 == 0 ? TYPE_2 : TYPE_1;}@Overridepublic 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;}@Overridepublic void onBindViewHolder(TestBaseViewHolder holder, int position) {ItemPO item = getItem(position);holder.fillData(item);}@Overridepublic 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()中將數據填充展示。
完整示例請參考:
GitHub:https://github.com/cxcbupt/FullscreenDemo
?
總結
以上是生活随笔為你收集整理的RecyclerView用法--展示多种类型Item数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Displaying Bitmaps E
- 下一篇: getDimension,getDime