您好,登錄后才能下訂單哦!
Google在推出Android5.0的時候推出了Material Design ,而RecyclerView是Material Design 重要組件之一。當然還有CardView/Palette。
RecyclerView是用來替換傳統的ListView和GridView,瀑布流效果的。是的RecyclerView這一個控件,可以實現這三個效果。雖然在開始使用recyclerview的時候會感到有些男,但是用熟練了會發現recyclerview十分強大。它可以給每一item里面的控件設置點擊時間,而不需要擔心事件沖突的問題,如果是使用listview或者是gridview就必須要解決事件沖突,甚至listview或gridview的item只能設置一個點擊事件,否則就會造成事件沖突,而這些沖突并不好解決。所以recyclerview來了。
首先在項目中集成RecyclerView,在build.gradle添加RecyclerView的依賴
compile 'com.android.support:recyclerview-v7:23.2.1'
這樣項目中就集成 recyclerview了,Android Studio 會自動聯網下載 recyclerview包。
在activity_main.xml中,使用recyclerview.
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" />
布局中已經有了recyclerview的控件,下面就開始在代碼中編寫。
在這里解釋一下recyclerview的使用。就像listview那樣,recyclerview也需要一個適配器;在我們優化listview的時候,我們經常會使用到一個內部類ViewHolder來保存item中的控件,以便于item的復用。而現在recyclerview則必須使用ViewHolder。這個ViewHolder必須繼承RecyclerView.ViewHolder,RecyclerView.ViewHolder有一個參數的構造方法,傳入的是一個view,這個view 就是recyclerview的item。
RecyclerViewHolder:
public class RecyclerViewHolder extends RecyclerView.ViewHolder { public TextView textView; public ImageView p_w_picpathView; public RecyclerViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.textView); p_w_picpathView = (ImageView) itemView.findViewById(R.id.p_w_picpathView); } }
RecyclerViewHolder寫好之后就開始寫Adapter.同樣RecyclerAdapter需要繼承RecyclerView.Adapter<RecyclerViewHolder>,泛型ViewHolder就是自己自定義的RecyclerViewHolder。Adapter的寫法如下:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerViewHolder> { private List<Map<String, String>> dataList; public RecyclerAdapter() { dataList = new ArrayList<>(); } public void addAll(List<Map<String, String>> data){ dataList.addAll(data); } /** * * @param viewType 對應的是getItemViewType(int position)方法返回的數值 */ @Override public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); return new RecyclerViewHolder(view); } /** * * @param holder 對應的是onCreateViewHolder方法,返回的RecyclerViewHolder * @param position 當前的item的位置 */ @Override public void onBindViewHolder(RecyclerViewHolder holder, int position) { holder.textView.setText(dataList.get(position).get("data")); } @Override public int getItemCount() { return dataList.size(); } }
MainActivity中的代碼。
public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; //使用線性布局管理器,設置的方向orientation是默認,即垂直方向 private LinearLayoutManager manager; //適配器 private RecyclerAdapter adapter; //數據源 private List<Map<String, String>> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); manager = new LinearLayoutManager(this); adapter = new RecyclerAdapter(); //設置布局管理器 recyclerView.setLayoutManager(manager); //給recyclerview設置適配器 recyclerView.setAdapter(adapter); list = new ArrayList<>(); for (int i=0;i<50;i++) { Map<String,String> map = new HashMap<>(); map.put("data", "item--> "+i); list.add(map); } adapter.addAll(list); adapter.notifyDataSetChanged(); } }
recyclerview實現listview的效果就完成了,運行效果:
如果是想每個item橫向滑動的話,只需要使用LinearLayoutManager的三個參數的構造方法就行了,new LInearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true)就可以實現橫向滑動的效果了。
recyclerView實現GridView的效果。需要是用是GridLayoutManager。將recyclerView的布局管理器更換成GridLayoutManager manager = new GridLayoutManager(this, 2),效果圖如下:
給RecyclerView添加滾動監聽。與listView和gridView有寫不同,recyclerView判斷滾動到哪一個位置的餓時候,需要使用到使用到布局管理器(前面設置的recyclerview.setLayoutManager())。滾動監聽的方法有兩個,setOnScrollListener(已不推薦使用)和addOnScrollListener。兩個方法本質上是一致的。代碼如下:
recyclerView_follow.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); //滾動的狀態改變時,調用此方法。 } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //屏幕中最下面一個item的所在數據源的位置(postion)。 int lastVisiableItem = manager.findLastVisibleItemPosition(); //一共有多少個 int totalItemCount = manager.getItemCount(); //當滑動到倒數第二個item時,即聯網獲取下一頁的數據 if (lastVisiableItem >= totalItemCount - 2 && dy > 0) { page++;//第二頁 reloadData(page); } } });
給RecyclerView添加監聽事件:
首先在Adapter中的onBindViewHolder方法中設置點擊事件,使用holder.xxx.setOnClickListener()設置點擊事件.RecyclerView避免了事件的沖突問題,可以給每個item中的控件設置點擊事件.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。