1. 程式人生 > >Android開發筆記之RecycleView載入不同item佈局的實現

Android開發筆記之RecycleView載入不同item佈局的實現

RecycleView是安卓5.0版本以後推出的新控制元件

優點

  1. 想要控制其顯示的方式,請通過佈局管理器LayoutManager
  2. 想要控制Item間的間隔(可繪製),請通過ItemDecoration
  3. 想要控制Item增刪的動畫,請通過ItemAnimator
  4. 想要控制點選、長按事件,請自己寫
  5. recycleview只負責提供內容展示的區域,集體內容的顯示樣式是那種形式,由佈局管理器LayoutManager來負責
  6. .item點選提供了動畫效果,需要繼承ItemAnimator
    7.點選事件的話,需要自己動手寫

載入不同的Item佈局,我們的思路就是通過

getItemViewType(int
position) //這個方法來判斷是載入那個佈局

我們實現的就是一個頭佈局外加一個i普通的item佈局,主要實現步有如下幾步

  1. 建立兩個item佈局
  2. 建立兩個ViewHolder,主要用來實現初始化
  3. 重寫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);