編輯:關於Android編程
本篇記錄的是Android中RecyclerView的使用方法,RecyclerView是android.support.v7包中提供的可以用於顯示類似ListView和GridView的控件,不過RecyclerView比ListView和GridView更為靈活,可以很容易的實現不同排列方式的列表。
要在AndroidStudio中使用RecyclerView,需要在app模塊的build.gradle中加入下面的依賴:
compile 'com.android.support:recyclerview-v7:23.2.1'
下面通過一個Demo來說明RecyclerView的使用方法,主要是實現如下圖的幾個效果:
下面說明RecyclerView的使用步驟:
以上圖的普通ListView為例,下面是適配器代碼:
public class NormalListViewAdapter extends RecyclerView.Adapter{ private Context context; private List listData; //listview數據集合 private LayoutInflater layoutInflater; private OnItemClickListener onItemClickListener; public NormalListViewAdapter(Context context, List listData) { this.context = context; this.listData = listData; layoutInflater = LayoutInflater.from(context); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //創建ViewHolder,這裡要注意必須使用layoutInflater.inflate(R.layout.list_item_normal, parent, false)創建,否則會報錯 MyViewHolder holder = new MyViewHolder(layoutInflater.inflate(R.layout.list_item_normal, parent, false)); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, final int position) { holder.tv.setText(listData.get(position)); //如果監聽器不為空,就在這裡為ListItem綁定點擊事件處理 if(this.onItemClickListener != null) { holder.tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.onClick(v, position); } }); } } @Override public int getItemCount() { return listData.size(); } //接口定義,用於處理ListItem的點擊事件 public interface OnItemClickListener { void onClick(View itemView, int position); } //給Adapter設置ListItem點擊監聽器 public void setOnItemClickListener(OnItemClickListener listener) { if(listener != null) { this.onItemClickListener = listener; } } }
上面的代碼中已有部分注釋說明,下面還有幾點需要注意:
RecyclerView默認不提供分割線,所以顯示出來的列表是沒有分割線的,為了顯示出分割線,我們可以在ListItem的布局代碼中加入一條分割線了,這樣就能達到目的了; RecyclerView默認也是沒有處理ListItem的點擊事件的,所以如果我們不在Adapter中處理ListItem的點擊事件,那麼RecyclerView的ListItem點擊就沒有任何反應。RecyclerView中有一個MyViewHolder類,該類繼承了RecyclerView.ViewHolder,代碼如下:
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView tv; public MyViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.list_item_tv); }
}
下面是顯示RecyclerView的代碼:
public class NormalListViewActivity extends AppCompatActivity { private RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_normal_list_view); recyclerView = (RecyclerView) findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); final Listdata = new ArrayList<>(); for(int i = 0; i < 30; i++) { data.add("item " + i); } NormalListViewAdapter adapter = new NormalListViewAdapter(this, data); recyclerView.setAdapter(adapter); adapter.setOnItemClickListener(new NormalListViewAdapter.OnItemClickListener() { @Override public void onClick(View itemView, int position) { showToast(String.format("%s clicked", data.get(position))); } }); } public void showToast(String msg) { Toast.makeText(NormalListViewActivity.this, msg, Toast.LENGTH_SHORT).show(); } }
以上代碼需要注意的地方是:RecyclerView需要指定一個布局管理器,由於我們顯示的是類似ListView的列表,所以上面用的LinearLayoutManager,如果我們要顯示成GridView的樣子,就不能再用LinearLayoutManager了,需要使用StaggeredGridLayoutManager。
下面是ListItem的布局代碼:
主要是一個TextView顯示數據,下面一個TextView作為分割線。這裡需要注意的是ListItem布局的根節點LinearLayout的width和height屬性,因為每個ListItem占一行,所以width是match_parent,而height屬性一定不要搞成match_parent了,如果是match_parent,則最後顯示出來的列表,每個Item高度占滿屏幕高度,在後面的使用RecyclerView顯示GridView時也需要注意這個問題。
到這裡基本上使用RecyclerView顯示一個ListView就完成了,其實使用方法比較簡單,用起來也比較方便。
如果要使用RecyclerView顯示一個水平滾動的GridView,以上代碼中需要改動的地方有:
ListItem的布局文件,需要修改如下(注意LinearLayout節點的width和height屬性):RecyclerView的布局管理器,需要修改成如下:
//水平的GridView,分4行顯示 recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.HORIZONTAL));
如果要使用RecyclerView顯示一個如上圖中顯示的瀑布流布局,思路是在垂直顯示的GridView的基礎上,給每個ListItem指定一個隨機的高度,這樣就能顯示成瀑布流形態了,主要是適配器中的代碼:
public class WaterFallAdapter extends RecyclerView.Adapter{ private Context context; private List listData; private LayoutInflater layoutInflater; private int[] heights; //保存每個item的高度 private Random random; public WaterFallAdapter(Context context, List listData) { this.context = context; this.listData = listData; this.random = new Random(); this.heights = new int[listData.size()]; //生成隨機的高度值 for(int i = 0; i < heights.length; i++) { heights[i] = random.nextInt(200) + 100; } layoutInflater = LayoutInflater.from(context); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder = new MyViewHolder(layoutInflater.inflate(R.layout.grid_item_vertical, parent, false)); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { ViewGroup.LayoutParams params = holder.tv.getLayoutParams(); //設置item的高度 params.height = heights[position]; holder.tv.setLayoutParams(params); holder.tv.setText(listData.get(position)); } @Override public int getItemCount() { return listData.size(); } }
如何用ES文件浏覽器查看wifi密碼。ES文件浏覽器是一個能管理手機本地、局域網共享、FTP和藍牙文件的管理器。其實就是一個電腦和手機網絡文件傳輸軟件。可大
最近事情太多了,也有一小段時間沒更新了,本來原來還有個寫哪些的計劃的,也打亂了,我就想到什麼寫什麼吧。 最近很多人在問Android Studio如何更改SDK版本,這邊
Android開發中我們經常需要用到將dip、px相互換算、獲取手機屏幕的寬度、高度以及狀態欄高度等,如下是基於屏幕這一塊整理的一個類。package com.per.l
目前小米手機最新的系統為MIUI 6,相信米粉們對MIUI6都非常熟悉。你是否知道,這系統支持這音量鍵喚醒,那麼要如何去開啟這音量鍵喚醒呢?下面就一起來看看