Android開發筆記之RecycleView載入不同item佈局的實現
阿新 • • 發佈:2019-01-22
RecycleView是安卓5.0版本以後推出的新控制元件
優點
- 想要控制其顯示的方式,請通過佈局管理器LayoutManager
- 想要控制Item間的間隔(可繪製),請通過ItemDecoration
- 想要控制Item增刪的動畫,請通過ItemAnimator
- 想要控制點選、長按事件,請自己寫
- recycleview只負責提供內容展示的區域,集體內容的顯示樣式是那種形式,由佈局管理器LayoutManager來負責
- .item點選提供了動畫效果,需要繼承ItemAnimator
7.點選事件的話,需要自己動手寫
載入不同的Item佈局,我們的思路就是通過
getItemViewType(int position)
//這個方法來判斷是載入那個佈局
我們實現的就是一個頭佈局外加一個i普通的item佈局,主要實現步有如下幾步
- 建立兩個item佈局
- 建立兩個ViewHolder,主要用來實現初始化
- 重寫RecycleView的介面卡
依賴下面加上這句話,主要用來顯示圓角圖片
compile 'de.hdodenhof:circleimageview:2.0.0'
第一步:建立兩個item佈局
//頭佈局的程式碼,在頭佈局中,我使用了一個圓角圖片的工具,在依賴下面寫上這句話
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="@color/colorAccent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/head_image"
android:layout_width="96dp"
android:layout_height="96dp"
android:src="@mipmap/touxiang"
android:layout_marginTop="5dp"
android:layout_centerHorizontal="true"
app:civ_border_width="0dp"/>
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_below="@+id/head_image"
android:layout_centerHorizontal="true"
android:text="空靈畫師"
android:textColor="@color/white"
android:textSize="22sp"/>
</RelativeLayout>
//普通的item佈局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"
android:padding="16dp"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:id="@+id/tv_text"
android:text="好友分享"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"/>
<ImageView
android:id="@+id/iv_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/iconfont_xiayiye"
android:layout_alignParentRight="true"/>
</RelativeLayout>
接下來的是重點部分Adapter的書寫
public class MyRecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private LayoutInflater mLayoutInflater;
private Context context;
private String[] titles;
//建立列舉 2個item 型別
public enum ITEM_TYPE {
ITEM1,
ITEM2
}
public MyRecycleAdapter(Context context, String[] titles) {
this.titles = titles;
this.context = context;
mLayoutInflater = LayoutInflater.from(context);
}
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ITEM_TYPE.ITEM1.ordinal()) {
return new Item1ViewHolder(mLayoutInflater.inflate(R.layout.recycle_head, parent, false));
} else {
return new Item2ViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
}
}
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof Item1ViewHolder) {
((Item1ViewHolder) holder).mTextView.setText(titles[position]);
} else if (holder instanceof Item2ViewHolder) {
((Item2ViewHolder) holder).mTextView.setText(titles[position]);
}
}
public int getItemViewType(int position) {
switch (position) {
case 0:
return ITEM_TYPE.ITEM1.ordinal();
}
return ITEM_TYPE.ITEM2.ordinal();
}
public int getItemCount() {
return titles == null ? 0 : titles.length;
}
//頭佈局 的ViewHolder
public static class Item1ViewHolder extends RecyclerView.ViewHolder {
TextView mTextView;
public Item1ViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.tv_name);
}
}
//普通item 的ViewHolder
public static class Item2ViewHolder extends RecyclerView.ViewHolder {
TextView mTextView;
public Item2ViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.tv_text);
}
}
}
mainactivy中的書寫
private RecyclerView mRecyclerView;
//item 顯示所需(僅供DEMO)
private String[] title = {"空靈畫師", "諸葛亮--運籌帷幄,決勝千里之外", "司馬懿 --奸臣賊子", "馬超--西涼三馬二哥",
"趙子龍--當陽破七進七出", "姜維--一生為蜀國消盡全力", "法正--謀略的決策者", "張飛--猛漢張飛,粗中有細",
"關羽--義氣的化身,吾輩敬之", "劉備--草鞋劉備三分天下", "曹操--寧我負天下人,不讓天下人負我"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.act_recycleView);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
mRecyclerView.setLayoutManager(linearLayoutManager);
mRecyclerView.setAdapter(new MyRecycleAdapter(this, title));
}
這幾句程式碼比較重要
//這句程式碼設定內容顯示為垂直顯示
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
//將mRecyclerView與線性佈局管理器關聯起來
mRecyclerView.setLayoutManager(linearLayoutManager);