Material Design之RecyclerView的使用(一)

來源:互聯網
上載者:User

標籤:design   recyclerview   material design   android5.x   

Android 5.0開始就推薦使用Material Design這個設計語言,本文開始就逐一講解Material Design中控制項的使用。本章主要講解RecyclerView,期中會帶有ToolBar的代碼,也是一個Android5.x推薦使用ToolBar替代ActionBar的控制項,RecyclerView 是 android-support-v7包中的一個控制項,使用該控制項時需要添加com.android.support:recyclerview-v7:22.2.0包依賴,該包可在我們下載的sdk目錄下D:\Program Files\Android\sdk\extras\android\support\v7\recyclerview\libs找到。

下面說說使用RecyclerView的優點和能做什麼事:

  • 提供一種外掛程式式編程,開發人員對RecyclerView的設計更加自由
  • 強制開發人員使用ViewHolder模式,效能更優
  • 可以用來實現ListView、GridView、橫向ScrollView、瀑布流等功能,非常靈活

RecyclerView主要的方法:
  • setLayoutManager設定RecyclerView的布局管理器,預設給我們提供了三種: LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager。當然也可以繼承LayoutManager來自訂。
  • setItemAnimator  設定item的添加、刪除動畫效果,預設給我們提供了一種預設動畫效果:DefaultItemAnimator。同理也可以我們自己自訂想要的動畫效果。
  • addItemDecoration  添加item之間的分隔線,預設沒有提供類給我們使用,如果需要使用到分割線則需要我們自訂。
  • setAdapter設定RecyclerView的適配器,這個需要我們自己繼承RecyclerView.Adapter來實現。
  • RecyclerView中預設沒有提供onItemClick和onItemLongClick點擊事件方法,需要我們自己在適配器中寫介面來實現。
下面我們通過代碼來看看怎麼來使用RecyclerView:一、在gradle中添加jar包依賴:
二、在主布局中使用RecyclerView、定義Item布局:activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity">    <android.support.v7.widget.Toolbar        android:id="@+id/toolbar"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="?attr/colorPrimary"        android:minHeight="?attr/actionBarSize"        />    <android.support.v7.widget.RecyclerView        android:id="@+id/recyclerView"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_below="@+id/toolbar"        android:scrollbars="none" /></RelativeLayout>

item.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:background="@drawable/recyclerview_item"    android:layout_margin="10dp"    android:orientation="vertical"    android:layout_height="72dp">    <TextView        android:id="@+id/textView"        android:layout_width="match_parent"        android:padding="20dp"        android:layout_height="72dp"        android:textAppearance="?android:attr/textAppearanceLarge" /></LinearLayout>

三、在代碼中使用ToolBar和RecyclerView:MainActivity.java
public class MainActivity extends AppCompatActivity {    private Toolbar mToolbar;    private RecyclerView mRecyclerView;    private List<String> lists;    private MyAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mToolbar = (Toolbar)this.findViewById(R.id.toolbar);        setSupportActionBar(mToolbar);        initData();        mRecyclerView = (RecyclerView) this.findViewById(R.id.recyclerView);//        mRecyclerView.setHasFixedSize(true);//如果可以確定每個item的高度是固定的,設定這個選項可以提高效能        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));//設定RecyclerView的布局管理//      mRecyclerView.addItemDecoration();//設定RecyclerView中item的分割線,用的少,一般都用在item中設定margin分隔兩個item        mRecyclerView.setItemAnimator(new DefaultItemAnimator());//設定item的添加刪除動畫,採用預設的動畫效果        adapter = new MyAdapter(this,lists);        mRecyclerView.setAdapter(adapter);//設定Adapter        adapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {//添加監聽器            @Override            public void onItemClick(View view, int postion) {                Toast.makeText(MainActivity.this,"點擊的是:"+postion,Toast.LENGTH_SHORT).show();            }            @Override            public void onItemLongClick(View view, int postion) {                Toast.makeText(MainActivity.this, "長按的是:" + postion, Toast.LENGTH_SHORT).show();            }        });    }    private void initData(){        lists = new ArrayList<String>();        for (int i = 'A'; i < 'z'; i++)        {            lists.add(""+(char)i);        }    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        int id = item.getItemId();        switch (id){            case R.id.action_add:                lists.add(1, "add");//                adapter.notifyDataSetChanged();//用這個則可以更新資料,但是沒有動畫效果                adapter.notifyItemInserted(1);//注意:RecyclerView中添加用notifyItemInserted();才有動畫效果                break;            case R.id.action_delete:                lists.remove(1);                adapter.notifyItemRemoved(1);//RecyclerView中刪除用notifyItemRemoved();才有動畫效果                break;            case R.id.action_linear:                mRecyclerView.setLayoutManager(new LinearLayoutManager(this));//設定RecyclerView的GridLayoutManager布局管理,預設垂直,還有一個設定水平排列的構造方法                break;            case R.id.action_grid:                mRecyclerView.setLayoutManager(new GridLayoutManager(this,3));//設定RecyclerView的GridLayoutManager布局管理,預設為垂直                break;            case R.id.action_grid_horizontal:                mRecyclerView.setLayoutManager(new GridLayoutManager(this,3,GridLayoutManager.HORIZONTAL,false));//設定RecyclerView的GridLayoutManager的水平布局管理,參數分別為context,列數或行數,相片順序,是否反轉布局的內容                break;            case R.id.action_staggeredgrid:                mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));//設定RecyclerView的StaggeredGridLayoutManager的布局管理,它是GridLayout升級版,可以顯示交錯式網格布局,參數分別為列數或行數,相片順序                break;        }        return super.onOptionsItemSelected(item);    }}
【注意】:使用ToolBar時,必須在styles.xml中設定當前Activity使用的style風格為NoActionBar。如果想改變狀態列的背景色,則需要在style中定義item,name="colorPrimaryDark",僅支援Android5.x。

四、自訂Adapter。
MyAdapter.java
/** * 繼承RecyclerView的Adapter,它會強制開發人員使用ViewHolder模式,所以繼承適配器的時候傳入的泛型是一個繼承自ViewHolder的實作類別 * 不過RecyclerView中沒有提供給我們Click和onLongClick監聽器,需要我們自己實現 */public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {    private Context context;    private List<String> lists;    private OnItemClickListener mOnItemClickListener;    public interface OnItemClickListener {        void onItemClick(View view, int postion);        void onItemLongClick(View view, int postion);    }    public void setOnItemClickListener(OnItemClickListener listener) {//對外提供的一個監聽方法        this.mOnItemClickListener = listener;    }    public MyAdapter(Context context, List<String> lists) {        this.context = context;        this.lists = lists;    }    @Override    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {//建立一個ViewHolder        View itemView = LayoutInflater.from(context).inflate(R.layout.item, viewGroup, false);//填充這個item布局        MyViewHolder viewHolder = new MyViewHolder(itemView);//建立ViewHolder        return viewHolder;    }    @Override    public void onBindViewHolder(final MyViewHolder myViewHolder, int pos) {//綁定ViewHolder        myViewHolder.mTextView.setText(lists.get(pos));//為ViewHolder裡的控制項設定值        if (mOnItemClickListener != null) {//如果設定了監聽那麼它就不為空白,然後回調相應的方法            myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    int postion = myViewHolder.getLayoutPosition();//得到當前點擊item的位置postion                    mOnItemClickListener.onItemClick(myViewHolder.itemView, postion);                }            });            myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {                @Override                public boolean onLongClick(View v) {                    int postion = myViewHolder.getLayoutPosition();                    mOnItemClickListener.onItemLongClick(myViewHolder.itemView, postion);                    return true;                }            });        }    }    @Override    public int getItemCount() {        return lists.size();    }}class MyViewHolder extends RecyclerView.ViewHolder {    TextView mTextView;    public MyViewHolder(View itemView) {        super(itemView);        mTextView = (TextView) itemView.findViewById(R.id.textView);    }}
至此RecyclerView用法就是這些了。其中需要注意的是在RecyclerView中添加和刪除item時,要想有動畫效果,則需要使用adapter.notifyItemInserted();和adapter.notifyItemRemoved();最後附上個運行:

源碼:http://download.csdn.net/detail/u010687392/8868487

轉載請註明出處:http://blog.csdn.net/u010687392

下一篇將講用RecyclerView實現瀑布流效果!



著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Material Design之RecyclerView的使用(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.