RecyclerView的功能十分強大,通過一個RecyclerView可以變換成為listview、gridview、瀑布流,下面就詳細介紹一個RecyclerView的具體使用方法
項目示例截圖:
1、首先找到RecyclerView的一個jar包,這個jar包要和你的sdk版本盡量是一緻的,要不然有可能會出現找不到資源的錯誤,jar包路徑在
..\sdk\extras\android\support\v7\recyclerview\libs(sdk安裝路徑下的檔案夾)
找到jar包之後可以直接拷貝到項目的libs檔案下,然後就可以使用RecyclerView了
2、建立布局檔案,示例中的布局檔案隻放置了一個RecyclerView,代碼如下
(注意:要使用<android.support.v7.widget.RecyclerView>聲明)
<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"
tools:context="com.example.recyclerviewdemo.MainActivity" >
<<span style="color:#ff6666;">android.support.v7.widget.RecyclerView</span>
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
3、為RecyclerView的每一個item設定一個布局,這裡就簡單的使用一個TextView來充當item,内容設定為wrap_content
<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="wrap_content"
android:background="#ffcc00"
android:layout_margin="5dp"
tools:context="com.example.recyclerviewdemo.MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="TextView" />
</RelativeLayout>
4、為RecyclerView設定一個Adapter來實作資料和視圖的一個綁定
(RecyclerView的adapter需要繼承RecyclerView.Adapter<MyViewholder>這裡的MyViewholder是重寫的一個Viewholder,RecyclerView的adapter必須結合Viewholder來使用,這對布局的優化起了很大的作用)
RecyclerView的adapter主要有兩個方法和一個Viewholder類組成
a、onCreateViewHolder方法,主要是實作把布局檔案執行個體化出來,然後放進我們的Viewholder内部類中進行控件的執行個體化
public MyViewholder onCreateViewHolder(ViewGroup arg0, int arg1) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.item, arg0, false);
MyViewholder myViewholder = new MyViewholder(view);
return myViewholder;
}
b、onBindViewHolder方法,主要是将資料和我們的控件綁定在一起,實作資料綁定
public void onBindViewHolder(final MyViewholder arg0, int arg1) {
// TODO Auto-generated method stub
arg0.textView.setText(list.get(arg1));
}
c、ViewHolder内部類,這裡我們重寫了一個MyViewholder内部類,繼承了Viewholder,實作控件的執行個體化
class MyViewholder extends ViewHolder {
TextView textView;
public MyViewholder(View arg0) {
super(arg0);
textView = (TextView) arg0.findViewById(R.id.textView1);
}
}
通過上面幾個方法的完成,我們就可以将資料通過構造方法傳入adapter中,實作資料和視圖的綁定
5、在MainActivity中,我們需要執行個體化我們的adapter和RecyclerView
控件的執行個體化和平時一樣,主要講一下RecyclerView和listveiw等不同的點,RecyclerView主要是通過LayoutManager來進行管理的,通過LayoutManager來實作不同的樣式,下面我們來分别介紹一下,通過RecyclerView來實作listview和gridview和瀑布流三種樣式
a、實作listview功能
通過使用LinearLayoutManager我們可以實作listveiw的樣式
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
這裡是設定了一個垂直方向的listview
b、通過使用GridLayoutManager我們可以實作GridView樣式
recyclerView.setLayoutManager(new GridLayoutManager(this, 3,GridLayoutManager.HORIZONTAL, false));
上面參數表示了分3列顯示資料,方向為水準方向
c、通過使用StaggeredGridLayoutManager我們可以實作瀑布流樣式
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
通過上面簡單的設定我們就可以實作不同的顯示樣式,方法非常簡單
6、上面已經介紹了比較核心的使用代碼,下面把項目的源碼釋出一下
6.1 MainActivity代碼
public class MainActivity extends ActionBarActivity {
private RecyclerView recyclerView;
private List<String> lists;
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
//
private void initView() {
// TODO Auto-generated method stub
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setAdapter(mAdapter);
LinearLayoutManager layoutManager = new LinearLayoutManager(
getApplicationContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
//此處是為了添加一個分隔線
// recyclerView.addItemDecoration(new DividerItemDecoration(
// getApplicationContext(), DividerItemDecoration.VERTICAL_LIST));
}
private void initData() {
// TODO Auto-generated method stub
lists = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
if (i % 2 == 0) {
lists.add("ggggggggggggggggffffffffffffffggggggggggggggggffffffffffffffggggggggggggggggfffffffffffffffffffffffffkkkkk"
+ i);
} else {
lists.add("gggggggggggggggg" + i);
}
}
mAdapter = new MyAdapter(getApplicationContext(), lists);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.listview:
recyclerView.setLayoutManager(new LinearLayoutManager(this,
LinearLayoutManager.VERTICAL, false));
break;
case R.id.gridview:
recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
break;
case R.id.horizengridview:
recyclerView.setLayoutManager(new GridLayoutManager(this, 2,
GridLayoutManager.HORIZONTAL, false));
break;
case R.id.pubuliu:
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,
StaggeredGridLayoutManager.VERTICAL));
break;
case R.id.add:
mAdapter.add(1);
break;
case R.id.delete:
mAdapter.delete(1);
break;
}
return true;
}
}
6.2 MyAdapter代碼
public class MyAdapter extends RecyclerView.Adapter<MyViewholder> {
private LayoutInflater inflater;
private Context context;
private List<String> list;
public MyAdapter(Context context, List<String> list) {
// TODO Auto-generated constructor stub
this.context = context;
this.list = list;
inflater = LayoutInflater.from(context);
}
@Override
public int getItemCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public void onBindViewHolder(final MyViewholder arg0, int arg1) {
// TODO Auto-generated method stub
arg0.textView.setText(list.get(arg1));
}
@Override
public MyViewholder onCreateViewHolder(ViewGroup arg0, int arg1) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.item, arg0, false);
MyViewholder myViewholder = new MyViewholder(view);
return myViewholder;
}
public void add(int pos) {
list.add(pos, "插入新的");
this.notifyItemInserted(pos);
}
public void delete(int pos) {
list.remove(pos);
this.notifyItemRemoved(pos);
}
}
class MyViewholder extends ViewHolder {
TextView textView;
public MyViewholder(View arg0) {
super(arg0);
// TODO Auto-generated constructor stub
textView = (TextView) arg0.findViewById(R.id.textView1);
}
}