Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android RecyclerView的使用

Android RecyclerView的使用

編輯:關於Android編程

本篇記錄的是Android中RecyclerView的使用方法,RecyclerView是android.support.v7包中提供的可以用於顯示類似ListView和GridView的控件,不過RecyclerView比ListView和GridView更為靈活,可以很容易的實現不同排列方式的列表。

AndroidStudio中使用RecyclerView

要在AndroidStudio中使用RecyclerView,需要在app模塊的build.gradle中加入下面的依賴:

compile 'com.android.support:recyclerview-v7:23.2.1'

下面通過一個Demo來說明RecyclerView的使用方法,主要是實現如下圖的幾個效果:
下面說明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);
}

}

在Activity中使用RecyclerView和適配器

下面是顯示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 List data = 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();
    }
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved