material design(二)RecycleView的使用詳解

前言:

上一篇[material design(一)CardView的使用詳解](http://blog.csdn.net/fine1938768839/article/details/68925736介紹了material design的第一個控件cradview,這個控件使用起來十分簡單,但是效果卻非常好,這篇文章是介紹material design的一個最重要最強大的控件—–recycleview。

優勢:

  1. 更大強大。recycleview可以一秒變換listview,gridview以及流式佈局。
  2. 更大可靠。recycleview強制使用viewholder,內部做了優化,使得控件效率更高。
  3. 可擴展性高。recyclevview做到了真正的解耦合,可以配置多種參數。
  4. 繼承自NestedScrollingChild,控件交互效果更多樣
    5.。。。

本篇文章主要是介紹recycleview的基本使用方法,主要包括加載數據,間隔設置,增刪動畫以及點擊事件等等。。

使用:

1.看activity中代碼:

public class ListViewActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private ListViewAdapter mListViewAdapter;
    private List<ListBean> mBeen=new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);
        mRecyclerView= (RecyclerView) findViewById(R.id.recycle_view);
        //關鍵,LayoutManager是用來區別listivew,gradview不同效果的。
        LinearLayoutManager manager=new LinearLayoutManager(this);
        //默認是垂直,也可以設置成水平
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        //加載manager,體現了鬆耦合
        mRecyclerView.setLayoutManager(manager);
        for(int i=0;i<30;i++){
            mBeen.add(new ListBean("zhangsan"+i+i));
        }
        mListViewAdapter=new ListViewAdapter();
        //加載適配器
        mRecyclerView.setAdapter(mListViewAdapter);

        mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mListViewAdapter.setData(mBeen);
    }
}

mRecyclerView.setLayoutManager(manager);很重要,listview的效果就是LinearLayoutManager,gridview效果就是GridLayoutManager,StaggeredGridLayoutManager是瀑布流的效果。


mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));這是設置item的間隔,默認是沒有間隔的。


mRecyclerView.setItemAnimator(new DefaultItemAnimator());這是設置數據變動的動畫效果。

2.adapter

public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.ViewHolder> {

    private Context mContext;
    private List<ListBean> mData=new ArrayList<>();
    private LayoutInflater inflater;

    public List<ListBean> getData() {
        return mData;
    }

    public void setData(List<ListBean> data) {
        mData = data;
        notifyDataSetChanged();
    }

    public void addData(List<ListBean> data){
        mData.addAll(data);
        notifyDataSetChanged();
    }

    /**
     * 複用item佈局
     * @param parent Recycleview
     * @param viewType type類型
     * @return 內部類viewhodler對象
     */

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(mContext==null){
            mContext=parent.getContext();
            inflater=LayoutInflater.from(mContext);
        }
        View view= inflater.inflate(R.layout.listview_item,parent,false);
        Log.i("sssss1",parent.toString()+"    "+viewType);
        return new ListViewAdapter.ViewHolder(view);
    }

    /**
     *
     * @param holder onCreateViewHolder返回的holder
     * @param position 位置
     */
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        Log.i("sssss2",holder.toString()+"    "+position);
        ListBean bean=mData.get(position);
        holder.mTextView.setText(bean.getName());
          //點擊事件
        holder.mTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addData(position);
            }
        });
        //長按事件
        holder.mTextView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                removeData(position);
                return false;
            }
        });

    }

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    /**
     * ViewHolder的內部類,View爲item的佈局,其他小的控件
     * 可以findviewbyid獲得,這個view就是textview
     */
    static class ViewHolder extends RecyclerView.ViewHolder{
        private TextView mTextView;
        public ViewHolder(View itemView) {
            super(itemView);
            mTextView= (TextView) itemView;
        }
    }
    //增加數據,調用notifyItemInserted纔有動畫
    public void addData(int position) {
        mData.add(position, new ListBean("Insert One"));
        notifyItemInserted(position);
    }

//刪除數據,調用notifyItemRemoved纔有動畫
    public void removeData(int position) {
        mData.remove(position);
        notifyItemRemoved(position);
    }
}

數據綁定和listview的用法差不多,點擊事件需要我們自己寫,同時增刪數據調用的方法也需要注意。

實際上,以上兩個類就可以把recycleview集成到我們項目中去了,但是對於recycleview的數據刷新和加載功能,控件是沒有提供默認的方法的,需要我們自己來寫,下篇文章會重點分析一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章