android.support.v7.widget.RecyclerView是v7包裏的一個widget,很是強大的一個控件,徹底能夠代替listview,gridview和瀑布流。
java
這裏主要講三點:android
爲recyclerView設置LayoutManagerapp
RecyclerView.Adapterdom
刪除和添加數據的動畫效果展現ide
1.動畫
RecyclerView中有三種LayoutManager,以下:
this
LayoutManager |
Orientation |
LinearLayoutManager | HORIZONTAL、VERTICAL |
GridLayoutManager | HORIZONTAL、VERTICAL |
StaggeredGridLayoutManager | HORIZONTAL、VERTICAL |
解釋一下若設置成 LinearLayoutManager,就和ListView的展現效果基本同樣,但人家還能夠看成水平方向的listView;若設置GridLayoutManager就至關於girdView,一樣能夠設置成水平方向滑動;若設置成StaggeredGridLayoutManager,就是瀑布流了,一樣能夠設置成水平方向滑動。 spa
例如:code
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); //設置layoutmanager recyclerView.setLayoutManager(linearLayoutManager);
2.RecyclerView.Adapterxml
這個RecyclerView.Adapter可不得了啊,首先能夠帶範型,看源碼:
public static abstract class Adapter<VH extends ViewHolder> {。。。}
而後是個抽象類,舉個例子:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{ @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(parent.getContext(),R.layout.myview,null); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.content.setText(arrayList.get(position)); } @Override public int getItemCount() { return arrayList.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ private TextView content; public ViewHolder(View itemView) { super(itemView); content = (TextView) ((FrameLayout) itemView).getChildAt(0); } } }
這裏我自定了一個ViewHolder繼承RecyclerView.ViewHolder,說一下MyAdapter的執行流程:首先執行onCreateViewHolder方法,返回了咱們自定義的ViewHolder,而後onBindViewHolder方法。能夠看出RecyclerView.Adapter對ViewHolder進行了封裝。
3.刪除和添加數據的動畫效果展現,若是是baseAdapter怎麼刷新呢,調用notifyDataSetChanged()方法,那在使用RecyclerView時呢:
notifyItemInserted(int position); notifyItemRemoved(int position);
並且還有動畫效果。
好了來個例子:
R.layout.activity_recycler_view文件:
<?xml version="1.0" encoding="utf-8"?> <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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.sumu.gefdemo.activity.RecyclerViewActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </RelativeLayout>
actiivty中:
package com.sumu.gefdemo.activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.TextView; import com.sumu.gefdemo.R; import java.util.ArrayList; import java.util.Random; public class RecyclerViewActivity extends AppCompatActivity { private RecyclerView recyclerView; private MyAdapter myAdapter; private ArrayList<String> arrayList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler_view); recyclerView = (RecyclerView) findViewById(R.id.recyclerview); /** * 三種LayoutManager */ //1 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); //2. GridLayoutManager gridLayoutManager = new GridLayoutManager(this,4); gridLayoutManager.setOrientation(GridLayoutManager.HORIZONTAL); //3. StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL); //設置layoutmanager recyclerView.setLayoutManager(staggeredGridLayoutManager); Random random = new Random(); for (int i = 0;i < 100;i++){ random.nextInt(); arrayList.add(i + "gefufeng" + random.nextInt(10000000)); } myAdapter = new MyAdapter(); recyclerView.setAdapter(myAdapter); } public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{ @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(parent.getContext(),R.layout.myview,null); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.content.setText(arrayList.get(position)); } @Override public int getItemCount() { return arrayList.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ private TextView content; public ViewHolder(View itemView) { super(itemView); content = (TextView) ((FrameLayout) itemView).getChildAt(0); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0,1,1,"add"); menu.add(Menu.NONE,2,2,"delete"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == 1){ arrayList.add(1,"gefufenggefufenggefufenggefufenggefufeng"); myAdapter.notifyItemInserted(1); }else{ arrayList.remove(2); myAdapter.notifyItemRemoved(2); } return super.onOptionsItemSelected(item); } }
R.layout.myview文件:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:padding="10dp" android:background="#3f3" android:gravity="center" android:text="gefufebg" android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </FrameLayout>
效果圖(其中之一):