Material Design之RecyclerView的使用(一)

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找到。html

如下說說使用RecyclerView的長處和能作什麼事:java

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

RecyclerView基本的方法:
  • setLayoutManager設置RecyclerView的佈局管理器。默認給咱們提供了三種: LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager。

    固然也可以繼承LayoutManager來本身定義。android

  • setItemAnimator  設置item的加入、刪除動畫效果。默認給咱們提供了一種默認動畫效果:DefaultItemAnimator。同理也可以咱們本身本身定義想要的動畫效果。
  • addItemDecoration  加入item之間的分隔線,默認沒有提供類給咱們使用。假設需要使用到切割線則需要咱們本身定義。

  • setAdapter設置RecyclerView的適配器。這個需要咱們本身繼承RecyclerView.Adapter來實現。
  • RecyclerView中默認沒有提供onItemClick和onItemLongClick點擊事件方法。需要咱們本身在適配器中寫接口來實現。

如下咱們經過代碼來看看怎麼來使用RecyclerView:
1、在gradle中加入jar包依賴:


2、在主佈局中使用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>編程


3、在代碼中使用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。

4、本身定義Adapter。


MyAdapter.javaide

/**
 * 繼承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實現瀑布流效果!post

相關文章
相關標籤/搜索