RecycleView
簡介:
RecylerView是support-v7包中的新組件,是一個強大的滑動組件,與經典的ListView相比,同樣擁有item回收復用的功能,這一點從它的名字recylerview即回收view也可以看出。
優點及作用:
根據官方的介紹RecylerView是ListView的升級版,既然如此那RecylerView必然有它的優點,現就RecylerView相對於ListView的優點羅列如下:
- RecylerView封裝了viewholder的回收復用,也就是說RecylerView標准化了ViewHolder,編寫Adapter面向的是ViewHolder而不再是View了,復用的 邏輯被封裝了,寫起來更加簡單。
- 提供了一種插拔式的體驗,高度的解耦,異常的靈活,針對一個Item的顯示RecylerView專門抽取出了相應的類,來控制Item的顯示,使其的擴展性非常強。例如:你想控制橫向(解決了ListView只可以縱向分布的問題)或者縱向滑動列表效果可以通過LinearLayoutManager這個類來進行控制(與GridView效果對應的是GridLayoutManager,與瀑布流對應的還有StaggeredGridLayoutManager等),也就是說RecylerView不再拘泥於ListView的線性展示方式,它也可以實現GridView的效果等多種效果。你想控制Item的分隔線,可以通過繼承RecylerView的ItemDecoration這個類,然后針對自己的業務需求去抒寫代碼。
- 可以控制Item增刪的動畫,可以通過ItemAnimator這個類進行控制,當然針對增刪的動畫,RecylerView有其自己默認的實現。
初步使用RecycleView
首先第一步是導入v7包
右鍵項目,點擊Open Module Settings
進入以下界面,點擊Dependencies
點擊左下角的+符號
點擊第一項Library dependency,進入以下界面選擇recycleview-v7包就行了
acvitity_main.xml布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.contentprovide.liuliu.recycle_3.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="以下是RecycleView" /> <android.support.v7.widget.RecyclerView android:id="@+id/myRecycle" android:layout_width="wrap_content" android:layout_height="200dp"></android.support.v7.widget.RecyclerView> </LinearLayout>
java代碼實現:
package com.contentprovide.liuliu.recycle_3; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /* * * 把RecycleView添加進布局文件中 * */ public class MainActivity extends AppCompatActivity { // 聲明一個RecycleView變量 RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 把自定義的RecycleView變量和activity_main.xml中的id綁定 recyclerView = (RecyclerView) findViewById(R.id.myRecycle); // 設置RecycleView的布局方式,這里是線性布局,默認垂直 recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 實例化自定義適配器 MyAdapter myAdapter = new MyAdapter(); // 把適配器添加到RecycleView中 recyclerView.setAdapter(myAdapter); } // 自定義類繼承RecycleView.Adapter類作為數據適配器 class MyAdapter extends RecyclerView.Adapter { // 在適配器當中自定義內部類,其中的子對象用於呈現數據 class Myholder extends RecyclerView.ViewHolder { TextView t; public Myholder(View view) { super(view); // 實例化自定義對象 t = (TextView) view; } } // 以下是系統自動生成的三個方法 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Myholder myholder = new Myholder(new TextView(parent.getContext())); return myholder; } // 對控件賦值 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { Myholder mm = (Myholder) holder; mm.t.setText("item" + position); } @Override public int getItemCount() { return 10; } } }
實現效果:
使用資源文件自定義列表項
好多時候每個列表項我們需要展示更多的內容,並且要讓它更美觀,這個時候就需要自定義列表項,需要哪種效果,自己就在一個新的xml資源文件中定義
例如實現以下效果:
步驟:
自定義列表項布局文件list.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/te1" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#e20707" android:textSize="30dp" /> <TextView android:id="@+id/te2" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#0fec1a" android:textSize="15dp" /> </LinearLayout>
和上面一樣的activity_main.xml文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.contentprovide.liuliu.recycle_4.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="展示效果如下:" /> <android.support.v7.widget.RecyclerView android:id="@+id/myrecycleView" android:layout_width="wrap_content" android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView> </LinearLayout>
Java代碼實現:
package com.contentprovide.liuliu.recycle_4;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
String s_te1[] = {"內容一", "內容一", "內容一"};
String s_te2[] = {"內容二", "內容二", "內容二"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.myrecycleView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
MyAdapter myAdapter = new MyAdapter();
recyclerView.setAdapter(myAdapter);
}
class MyAdapter extends RecyclerView.Adapter {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyHolder myHolder = new MyHolder(LayoutInflater.from(getApplicationContext()).inflate(R.layout.list, null));//引入自定義列表項的資源文件
return myHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
MyHolder mm = (MyHolder) holder;
// 將數據映射到控件中
mm.te1.setText(s_te1[position]);
mm.te2.setText(s_te2[position]);
}
@Override
public int getItemCount() {
return s_te1.length;
}
class MyHolder extends RecyclerView.ViewHolder {
TextView te1, te2;
public MyHolder(View itemView) {
super(itemView);
// 實例化子對象,把對象和列表項布局文件中的id綁定
te1 = itemView.findViewById(R.id.te1);
te2 = itemView.findViewById(R.id.te2);
}
}
}
}
到這里RecycleView的基本使用就搞定了,下面加一些更加靈活的使用,例如:增加分隔線,通過幾行代碼的改變轉換成GridView效果。這里就可以體現RecycleView比ListView更加靈活的地方了
將線性布局的方向由垂直改成水平,實現如下效果:
recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));
可以看到不止實現了水平的布局,而且可以水平滾動,這種效果在ListView中是不支持的
將線性布局改成GridView布局
recyclerView.setLayoutManager(new GridLayoutManager(this,4));
網格布局默認狀態下是垂直的,如果是垂直的那么第二個參數代表有多少列,如果是水平布局那么第二個參數代表的是有多少行
轉換成水平的布局:
recyclerView.setLayoutManager(new GridLayoutManager(this,4,GridLayoutManager.HORIZONTAL,false));
添加系統自帶的分割線:
recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
自定義分割線比較繁瑣,有興趣可以看看這個大神的
http://blog.csdn.net/dmk877/article/details/50816933